Commit f1974222 authored by Matt Helsley's avatar Matt Helsley Committed by Josh Poimboeuf

objtool: Rename rela to reloc

Before supporting additional relocation types rename the relevant
types and functions from "rela" to "reloc". This work be done with
the following regex:

  sed -e 's/struct rela/struct reloc/g' \
      -e 's/\([_\*]\)rela\(s\{0,1\}\)/\1reloc\2/g' \
      -e 's/tmprela\(s\{0,1\}\)/tmpreloc\1/g' \
      -e 's/relasec/relocsec/g' \
      -e 's/rela_list/reloc_list/g' \
      -e 's/rela_hash/reloc_hash/g' \
      -e 's/add_rela/add_reloc/g' \
      -e 's/rela->/reloc->/g' \
      -e '/rela[,\.]/{ s/\([^\.>]\)rela\([\.,]\)/\1reloc\2/g ; }' \
      -e 's/rela =/reloc =/g' \
      -e 's/relas =/relocs =/g' \
      -e 's/relas\[/relocs[/g' \
      -e 's/relaname =/relocname =/g' \
      -e 's/= rela\;/= reloc\;/g' \
      -e 's/= relas\;/= relocs\;/g' \
      -e 's/= relaname\;/= relocname\;/g' \
      -e 's/, rela)/, reloc)/g' \
      -e 's/\([ @]\)rela\([ "]\)/\1reloc\2/g' \
      -e 's/ rela$/ reloc/g' \
      -e 's/, relaname/, relocname/g' \
      -e 's/sec->rela/sec->reloc/g' \
      -e 's/(\(!\{0,1\}\)rela/(\1reloc/g' \
      -i \
      arch.h \
      arch/x86/decode.c  \
      check.c \
      check.h \
      elf.c \
      elf.h \
      orc_gen.c \
      special.c

Notable exceptions which complicate the regex include gelf_*
library calls and standard/expected section names which still use
"rela" because they encode the type of relocation expected. Also, keep
"rela" in the struct because it encodes a specific type of relocation
we currently expect.

It will eventually turn into a member of an anonymous union when a
susequent patch adds implicit addend, or "rel", relocation support.
Signed-off-by: default avatarMatt Helsley <mhelsley@vmware.com>
Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
parent 1e968bf5
......@@ -82,6 +82,6 @@ bool arch_callee_saved_reg(unsigned char reg);
unsigned long arch_jump_destination(struct instruction *insn);
unsigned long arch_dest_rela_offset(int addend);
unsigned long arch_dest_reloc_offset(int addend);
#endif /* _ARCH_H */
......@@ -67,7 +67,7 @@ bool arch_callee_saved_reg(unsigned char reg)
}
}
unsigned long arch_dest_rela_offset(int addend)
unsigned long arch_dest_reloc_offset(int addend)
{
return addend + 4;
}
......
This diff is collapsed.
......@@ -37,7 +37,7 @@ struct instruction {
struct symbol *call_dest;
struct instruction *jump_dest;
struct instruction *first_jump_src;
struct rela *jump_table;
struct reloc *jump_table;
struct list_head alts;
struct symbol *func;
struct list_head stack_ops;
......
......@@ -228,26 +228,26 @@ struct symbol *find_symbol_by_name(const struct elf *elf, const char *name)
return NULL;
}
struct rela *find_rela_by_dest_range(const struct elf *elf, struct section *sec,
struct reloc *find_reloc_by_dest_range(const struct elf *elf, struct section *sec,
unsigned long offset, unsigned int len)
{
struct rela *rela, *r = NULL;
struct reloc *reloc, *r = NULL;
unsigned long o;
if (!sec->rela)
if (!sec->reloc)
return NULL;
sec = sec->rela;
sec = sec->reloc;
for_offset_range(o, offset, offset + len) {
elf_hash_for_each_possible(elf->rela_hash, rela, hash,
elf_hash_for_each_possible(elf->reloc_hash, reloc, hash,
sec_offset_hash(sec, o)) {
if (rela->sec != sec)
if (reloc->sec != sec)
continue;
if (rela->offset >= offset && rela->offset < offset + len) {
if (!r || rela->offset < r->offset)
r = rela;
if (reloc->offset >= offset && reloc->offset < offset + len) {
if (!r || reloc->offset < r->offset)
r = reloc;
}
}
if (r)
......@@ -257,9 +257,9 @@ struct rela *find_rela_by_dest_range(const struct elf *elf, struct section *sec,
return NULL;
}
struct rela *find_rela_by_dest(const struct elf *elf, struct section *sec, unsigned long offset)
struct reloc *find_reloc_by_dest(const struct elf *elf, struct section *sec, unsigned long offset)
{
return find_rela_by_dest_range(elf, sec, offset, 1);
return find_reloc_by_dest_range(elf, sec, offset, 1);
}
static int read_sections(struct elf *elf)
......@@ -288,7 +288,7 @@ static int read_sections(struct elf *elf)
memset(sec, 0, sizeof(*sec));
INIT_LIST_HEAD(&sec->symbol_list);
INIT_LIST_HEAD(&sec->rela_list);
INIT_LIST_HEAD(&sec->reloc_list);
s = elf_getscn(elf->elf, i);
if (!s) {
......@@ -488,21 +488,21 @@ static int read_symbols(struct elf *elf)
return -1;
}
void elf_add_rela(struct elf *elf, struct rela *rela)
void elf_add_reloc(struct elf *elf, struct reloc *reloc)
{
struct section *sec = rela->sec;
struct section *sec = reloc->sec;
list_add_tail(&rela->list, &sec->rela_list);
elf_hash_add(elf->rela_hash, &rela->hash, rela_hash(rela));
list_add_tail(&reloc->list, &sec->reloc_list);
elf_hash_add(elf->reloc_hash, &reloc->hash, reloc_hash(reloc));
}
static int read_relas(struct elf *elf)
static int read_relocs(struct elf *elf)
{
struct section *sec;
struct rela *rela;
struct reloc *reloc;
int i;
unsigned int symndx;
unsigned long nr_rela, max_rela = 0, tot_rela = 0;
unsigned long nr_reloc, max_reloc = 0, tot_reloc = 0;
list_for_each_entry(sec, &elf->sections, list) {
if (sec->sh.sh_type != SHT_RELA)
......@@ -510,49 +510,49 @@ static int read_relas(struct elf *elf)
sec->base = find_section_by_index(elf, sec->sh.sh_info);
if (!sec->base) {
WARN("can't find base section for rela section %s",
WARN("can't find base section for reloc section %s",
sec->name);
return -1;
}
sec->base->rela = sec;
sec->base->reloc = sec;
nr_rela = 0;
nr_reloc = 0;
for (i = 0; i < sec->sh.sh_size / sec->sh.sh_entsize; i++) {
rela = malloc(sizeof(*rela));
if (!rela) {
reloc = malloc(sizeof(*reloc));
if (!reloc) {
perror("malloc");
return -1;
}
memset(rela, 0, sizeof(*rela));
memset(reloc, 0, sizeof(*reloc));
if (!gelf_getrela(sec->data, i, &rela->rela)) {
if (!gelf_getrela(sec->data, i, &reloc->rela)) {
WARN_ELF("gelf_getrela");
return -1;
}
rela->type = GELF_R_TYPE(rela->rela.r_info);
rela->addend = rela->rela.r_addend;
rela->offset = rela->rela.r_offset;
symndx = GELF_R_SYM(rela->rela.r_info);
rela->sym = find_symbol_by_index(elf, symndx);
rela->sec = sec;
if (!rela->sym) {
WARN("can't find rela entry symbol %d for %s",
reloc->type = GELF_R_TYPE(reloc->rela.r_info);
reloc->addend = reloc->rela.r_addend;
reloc->offset = reloc->rela.r_offset;
symndx = GELF_R_SYM(reloc->rela.r_info);
reloc->sym = find_symbol_by_index(elf, symndx);
reloc->sec = sec;
if (!reloc->sym) {
WARN("can't find reloc entry symbol %d for %s",
symndx, sec->name);
return -1;
}
elf_add_rela(elf, rela);
nr_rela++;
elf_add_reloc(elf, reloc);
nr_reloc++;
}
max_rela = max(max_rela, nr_rela);
tot_rela += nr_rela;
max_reloc = max(max_reloc, nr_reloc);
tot_reloc += nr_reloc;
}
if (stats) {
printf("max_rela: %lu\n", max_rela);
printf("tot_rela: %lu\n", tot_rela);
printf("max_reloc: %lu\n", max_reloc);
printf("tot_reloc: %lu\n", tot_reloc);
}
return 0;
......@@ -578,7 +578,7 @@ struct elf *elf_open_read(const char *name, int flags)
elf_hash_init(elf->symbol_name_hash);
elf_hash_init(elf->section_hash);
elf_hash_init(elf->section_name_hash);
elf_hash_init(elf->rela_hash);
elf_hash_init(elf->reloc_hash);
elf->fd = open(name, flags);
if (elf->fd == -1) {
......@@ -611,7 +611,7 @@ struct elf *elf_open_read(const char *name, int flags)
if (read_symbols(elf))
goto err;
if (read_relas(elf))
if (read_relocs(elf))
goto err;
return elf;
......@@ -637,7 +637,7 @@ struct section *elf_create_section(struct elf *elf, const char *name,
memset(sec, 0, sizeof(*sec));
INIT_LIST_HEAD(&sec->symbol_list);
INIT_LIST_HEAD(&sec->rela_list);
INIT_LIST_HEAD(&sec->reloc_list);
s = elf_newscn(elf->elf);
if (!s) {
......@@ -722,25 +722,25 @@ struct section *elf_create_section(struct elf *elf, const char *name,
return sec;
}
struct section *elf_create_rela_section(struct elf *elf, struct section *base)
struct section *elf_create_reloc_section(struct elf *elf, struct section *base)
{
char *relaname;
char *relocname;
struct section *sec;
relaname = malloc(strlen(base->name) + strlen(".rela") + 1);
if (!relaname) {
relocname = malloc(strlen(base->name) + strlen(".rela") + 1);
if (!relocname) {
perror("malloc");
return NULL;
}
strcpy(relaname, ".rela");
strcat(relaname, base->name);
strcpy(relocname, ".rela");
strcat(relocname, base->name);
sec = elf_create_section(elf, relaname, sizeof(GElf_Rela), 0);
free(relaname);
sec = elf_create_section(elf, relocname, sizeof(GElf_Rela), 0);
free(relocname);
if (!sec)
return NULL;
base->rela = sec;
base->reloc = sec;
sec->base = base;
sec->sh.sh_type = SHT_RELA;
......@@ -752,33 +752,33 @@ struct section *elf_create_rela_section(struct elf *elf, struct section *base)
return sec;
}
int elf_rebuild_rela_section(struct section *sec)
int elf_rebuild_reloc_section(struct section *sec)
{
struct rela *rela;
struct reloc *reloc;
int nr, idx = 0, size;
GElf_Rela *relas;
GElf_Rela *relocs;
nr = 0;
list_for_each_entry(rela, &sec->rela_list, list)
list_for_each_entry(reloc, &sec->reloc_list, list)
nr++;
size = nr * sizeof(*relas);
relas = malloc(size);
if (!relas) {
size = nr * sizeof(*relocs);
relocs = malloc(size);
if (!relocs) {
perror("malloc");
return -1;
}
sec->data->d_buf = relas;
sec->data->d_buf = relocs;
sec->data->d_size = size;
sec->sh.sh_size = size;
idx = 0;
list_for_each_entry(rela, &sec->rela_list, list) {
relas[idx].r_offset = rela->offset;
relas[idx].r_addend = rela->addend;
relas[idx].r_info = GELF_R_INFO(rela->sym->idx, rela->type);
list_for_each_entry(reloc, &sec->reloc_list, list) {
relocs[idx].r_offset = reloc->offset;
relocs[idx].r_addend = reloc->addend;
relocs[idx].r_info = GELF_R_INFO(reloc->sym->idx, reloc->type);
idx++;
}
......@@ -821,7 +821,7 @@ void elf_close(struct elf *elf)
{
struct section *sec, *tmpsec;
struct symbol *sym, *tmpsym;
struct rela *rela, *tmprela;
struct reloc *reloc, *tmpreloc;
if (elf->elf)
elf_end(elf->elf);
......@@ -835,10 +835,10 @@ void elf_close(struct elf *elf)
hash_del(&sym->hash);
free(sym);
}
list_for_each_entry_safe(rela, tmprela, &sec->rela_list, list) {
list_del(&rela->list);
hash_del(&rela->hash);
free(rela);
list_for_each_entry_safe(reloc, tmpreloc, &sec->reloc_list, list) {
list_del(&reloc->list);
hash_del(&reloc->hash);
free(reloc);
}
list_del(&sec->list);
free(sec);
......
......@@ -32,8 +32,8 @@ struct section {
GElf_Shdr sh;
struct rb_root symbol_tree;
struct list_head symbol_list;
struct list_head rela_list;
struct section *base, *rela;
struct list_head reloc_list;
struct section *base, *reloc;
struct symbol *sym;
Elf_Data *data;
char *name;
......@@ -58,7 +58,7 @@ struct symbol {
bool uaccess_safe;
};
struct rela {
struct reloc {
struct list_head list;
struct hlist_node hash;
GElf_Rela rela;
......@@ -82,7 +82,7 @@ struct elf {
DECLARE_HASHTABLE(symbol_name_hash, ELF_HASH_BITS);
DECLARE_HASHTABLE(section_hash, ELF_HASH_BITS);
DECLARE_HASHTABLE(section_name_hash, ELF_HASH_BITS);
DECLARE_HASHTABLE(rela_hash, ELF_HASH_BITS);
DECLARE_HASHTABLE(reloc_hash, ELF_HASH_BITS);
};
#define OFFSET_STRIDE_BITS 4
......@@ -109,15 +109,15 @@ static inline u32 sec_offset_hash(struct section *sec, unsigned long offset)
return ol;
}
static inline u32 rela_hash(struct rela *rela)
static inline u32 reloc_hash(struct reloc *reloc)
{
return sec_offset_hash(rela->sec, rela->offset);
return sec_offset_hash(reloc->sec, reloc->offset);
}
struct elf *elf_open_read(const char *name, int flags);
struct section *elf_create_section(struct elf *elf, const char *name, size_t entsize, int nr);
struct section *elf_create_rela_section(struct elf *elf, struct section *base);
void elf_add_rela(struct elf *elf, struct rela *rela);
struct section *elf_create_reloc_section(struct elf *elf, struct section *base);
void elf_add_reloc(struct elf *elf, struct reloc *reloc);
int elf_write(const struct elf *elf);
void elf_close(struct elf *elf);
......@@ -126,11 +126,11 @@ struct symbol *find_func_by_offset(struct section *sec, unsigned long offset);
struct symbol *find_symbol_by_offset(struct section *sec, unsigned long offset);
struct symbol *find_symbol_by_name(const struct elf *elf, const char *name);
struct symbol *find_symbol_containing(const struct section *sec, unsigned long offset);
struct rela *find_rela_by_dest(const struct elf *elf, struct section *sec, unsigned long offset);
struct rela *find_rela_by_dest_range(const struct elf *elf, struct section *sec,
struct reloc *find_reloc_by_dest(const struct elf *elf, struct section *sec, unsigned long offset);
struct reloc *find_reloc_by_dest_range(const struct elf *elf, struct section *sec,
unsigned long offset, unsigned int len);
struct symbol *find_func_containing(struct section *sec, unsigned long offset);
int elf_rebuild_rela_section(struct section *sec);
int elf_rebuild_reloc_section(struct section *sec);
#define for_each_sec(file, sec) \
list_for_each_entry(sec, &file->elf->sections, list)
......
......@@ -80,56 +80,56 @@ int create_orc(struct objtool_file *file)
return 0;
}
static int create_orc_entry(struct elf *elf, struct section *u_sec, struct section *ip_relasec,
static int create_orc_entry(struct elf *elf, struct section *u_sec, struct section *ip_relocsec,
unsigned int idx, struct section *insn_sec,
unsigned long insn_off, struct orc_entry *o)
{
struct orc_entry *orc;
struct rela *rela;
struct reloc *reloc;
/* populate ORC data */
orc = (struct orc_entry *)u_sec->data->d_buf + idx;
memcpy(orc, o, sizeof(*orc));
/* populate rela for ip */
rela = malloc(sizeof(*rela));
if (!rela) {
/* populate reloc for ip */
reloc = malloc(sizeof(*reloc));
if (!reloc) {
perror("malloc");
return -1;
}
memset(rela, 0, sizeof(*rela));
memset(reloc, 0, sizeof(*reloc));
if (insn_sec->sym) {
rela->sym = insn_sec->sym;
rela->addend = insn_off;
reloc->sym = insn_sec->sym;
reloc->addend = insn_off;
} else {
/*
* The Clang assembler doesn't produce section symbols, so we
* have to reference the function symbol instead:
*/
rela->sym = find_symbol_containing(insn_sec, insn_off);
if (!rela->sym) {
reloc->sym = find_symbol_containing(insn_sec, insn_off);
if (!reloc->sym) {
/*
* Hack alert. This happens when we need to reference
* the NOP pad insn immediately after the function.
*/
rela->sym = find_symbol_containing(insn_sec,
reloc->sym = find_symbol_containing(insn_sec,
insn_off - 1);
}
if (!rela->sym) {
if (!reloc->sym) {
WARN("missing symbol for insn at offset 0x%lx\n",
insn_off);
return -1;
}
rela->addend = insn_off - rela->sym->offset;
reloc->addend = insn_off - reloc->sym->offset;
}
rela->type = R_X86_64_PC32;
rela->offset = idx * sizeof(int);
rela->sec = ip_relasec;
reloc->type = R_X86_64_PC32;
reloc->offset = idx * sizeof(int);
reloc->sec = ip_relocsec;
elf_add_rela(elf, rela);
elf_add_reloc(elf, reloc);
return 0;
}
......@@ -137,7 +137,7 @@ static int create_orc_entry(struct elf *elf, struct section *u_sec, struct secti
int create_orc_sections(struct objtool_file *file)
{
struct instruction *insn, *prev_insn;
struct section *sec, *u_sec, *ip_relasec;
struct section *sec, *u_sec, *ip_relocsec;
unsigned int idx;
struct orc_entry empty = {
......@@ -181,8 +181,8 @@ int create_orc_sections(struct objtool_file *file)
if (!sec)
return -1;
ip_relasec = elf_create_rela_section(file->elf, sec);
if (!ip_relasec)
ip_relocsec = elf_create_reloc_section(file->elf, sec);
if (!ip_relocsec)
return -1;
/* create .orc_unwind section */
......@@ -200,7 +200,7 @@ int create_orc_sections(struct objtool_file *file)
if (!prev_insn || memcmp(&insn->orc, &prev_insn->orc,
sizeof(struct orc_entry))) {
if (create_orc_entry(file->elf, u_sec, ip_relasec, idx,
if (create_orc_entry(file->elf, u_sec, ip_relocsec, idx,
insn->sec, insn->offset,
&insn->orc))
return -1;
......@@ -212,7 +212,7 @@ int create_orc_sections(struct objtool_file *file)
/* section terminator */
if (prev_insn) {
if (create_orc_entry(file->elf, u_sec, ip_relasec, idx,
if (create_orc_entry(file->elf, u_sec, ip_relocsec, idx,
prev_insn->sec,
prev_insn->offset + prev_insn->len,
&empty))
......@@ -222,7 +222,7 @@ int create_orc_sections(struct objtool_file *file)
}
}
if (elf_rebuild_rela_section(ip_relasec))
if (elf_rebuild_reloc_section(ip_relocsec))
return -1;
return 0;
......
......@@ -72,7 +72,7 @@ static int get_alt_entry(struct elf *elf, struct special_entry *entry,
struct section *sec, int idx,
struct special_alt *alt)
{
struct rela *orig_rela, *new_rela;
struct reloc *orig_reloc, *new_reloc;
unsigned long offset;
offset = idx * entry->size;
......@@ -118,30 +118,30 @@ static int get_alt_entry(struct elf *elf, struct special_entry *entry,
}
}
orig_rela = find_rela_by_dest(elf, sec, offset + entry->orig);
if (!orig_rela) {
WARN_FUNC("can't find orig rela", sec, offset + entry->orig);
orig_reloc = find_reloc_by_dest(elf, sec, offset + entry->orig);
if (!orig_reloc) {
WARN_FUNC("can't find orig reloc", sec, offset + entry->orig);
return -1;
}
if (orig_rela->sym->type != STT_SECTION) {
WARN_FUNC("don't know how to handle non-section rela symbol %s",
sec, offset + entry->orig, orig_rela->sym->name);
if (orig_reloc->sym->type != STT_SECTION) {
WARN_FUNC("don't know how to handle non-section reloc symbol %s",
sec, offset + entry->orig, orig_reloc->sym->name);
return -1;
}
alt->orig_sec = orig_rela->sym->sec;
alt->orig_off = orig_rela->addend;
alt->orig_sec = orig_reloc->sym->sec;
alt->orig_off = orig_reloc->addend;
if (!entry->group || alt->new_len) {
new_rela = find_rela_by_dest(elf, sec, offset + entry->new);
if (!new_rela) {
WARN_FUNC("can't find new rela",
new_reloc = find_reloc_by_dest(elf, sec, offset + entry->new);
if (!new_reloc) {
WARN_FUNC("can't find new reloc",
sec, offset + entry->new);
return -1;
}
alt->new_sec = new_rela->sym->sec;
alt->new_off = (unsigned int)new_rela->addend;
alt->new_sec = new_reloc->sym->sec;
alt->new_off = (unsigned int)new_reloc->addend;
/* _ASM_EXTABLE_EX hack */
if (alt->new_off >= 0x7ffffff0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment