objtool: Get rid of reloc->offset
Get the offset from the embedded GElf_Rel[a] struct. With allyesconfig + CONFIG_DEBUG_INFO: - Before: peak heap memory consumption: 43.83G - After: peak heap memory consumption: 42.10G Link: https://lore.kernel.org/r/2b9ec01178baa346a99522710bf2e82159412e3a.1685464332.git.jpoimboe@kernel.org Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
This commit is contained in:
parent
be9a4c1168
commit
e4cbb9b81f
3 changed files with 18 additions and 14 deletions
|
@ -511,11 +511,11 @@ static int add_pv_ops(struct objtool_file *file, const char *symname)
|
||||||
if (func->type == STT_SECTION)
|
if (func->type == STT_SECTION)
|
||||||
func = find_symbol_by_offset(reloc->sym->sec, reloc->addend);
|
func = find_symbol_by_offset(reloc->sym->sec, reloc->addend);
|
||||||
|
|
||||||
idx = (reloc->offset - sym->offset) / sizeof(unsigned long);
|
idx = (reloc_offset(reloc) - sym->offset) / sizeof(unsigned long);
|
||||||
|
|
||||||
objtool_pv_add(file, idx, func);
|
objtool_pv_add(file, idx, func);
|
||||||
|
|
||||||
off = reloc->offset + 1;
|
off = reloc_offset(reloc) + 1;
|
||||||
if (off > end)
|
if (off > end)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1998,7 +1998,7 @@ static int add_jump_table(struct objtool_file *file, struct instruction *insn,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Make sure the table entries are consecutive: */
|
/* Make sure the table entries are consecutive: */
|
||||||
if (prev_offset && reloc->offset != prev_offset + 8)
|
if (prev_offset && reloc_offset(reloc) != prev_offset + 8)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Detect function pointers from contiguous objects: */
|
/* Detect function pointers from contiguous objects: */
|
||||||
|
@ -2023,7 +2023,7 @@ static int add_jump_table(struct objtool_file *file, struct instruction *insn,
|
||||||
alt->insn = dest_insn;
|
alt->insn = dest_insn;
|
||||||
alt->next = insn->alts;
|
alt->next = insn->alts;
|
||||||
insn->alts = alt;
|
insn->alts = alt;
|
||||||
prev_offset = reloc->offset;
|
prev_offset = reloc_offset(reloc);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!prev_offset) {
|
if (!prev_offset) {
|
||||||
|
@ -4266,8 +4266,8 @@ static int validate_ibt_insn(struct objtool_file *file, struct instruction *insn
|
||||||
for (reloc = insn_reloc(file, insn);
|
for (reloc = insn_reloc(file, insn);
|
||||||
reloc;
|
reloc;
|
||||||
reloc = find_reloc_by_dest_range(file->elf, insn->sec,
|
reloc = find_reloc_by_dest_range(file->elf, insn->sec,
|
||||||
reloc->offset + 1,
|
reloc_offset(reloc) + 1,
|
||||||
(insn->offset + insn->len) - (reloc->offset + 1))) {
|
(insn->offset + insn->len) - (reloc_offset(reloc) + 1))) {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* static_call_update() references the trampoline, which
|
* static_call_update() references the trampoline, which
|
||||||
|
@ -4350,7 +4350,7 @@ static int validate_ibt_data_reloc(struct objtool_file *file,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
WARN_FUNC("data relocation to !ENDBR: %s",
|
WARN_FUNC("data relocation to !ENDBR: %s",
|
||||||
reloc->sec->base, reloc->offset,
|
reloc->sec->base, reloc_offset(reloc),
|
||||||
offstr(dest->sec, dest->offset));
|
offstr(dest->sec, dest->offset));
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -246,8 +246,9 @@ struct reloc *find_reloc_by_dest_range(const struct elf *elf, struct section *se
|
||||||
if (reloc->sec != rsec)
|
if (reloc->sec != rsec)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (reloc->offset >= offset && reloc->offset < offset + len) {
|
if (reloc_offset(reloc) >= offset &&
|
||||||
if (!r || reloc->offset < r->offset)
|
reloc_offset(reloc) < offset + len) {
|
||||||
|
if (!r || reloc_offset(reloc) < reloc_offset(r))
|
||||||
r = reloc;
|
r = reloc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -830,11 +831,12 @@ static struct reloc *elf_init_reloc(struct elf *elf, struct section *rsec,
|
||||||
}
|
}
|
||||||
|
|
||||||
reloc->sec = rsec;
|
reloc->sec = rsec;
|
||||||
reloc->offset = offset;
|
|
||||||
reloc->type = type;
|
reloc->type = type;
|
||||||
reloc->sym = sym;
|
reloc->sym = sym;
|
||||||
reloc->addend = addend;
|
reloc->addend = addend;
|
||||||
|
|
||||||
|
reloc->rel.r_offset = offset;
|
||||||
|
|
||||||
if (elf_write_reloc(elf, reloc))
|
if (elf_write_reloc(elf, reloc))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@ -908,7 +910,6 @@ static int read_reloc(struct section *rsec, int i, struct reloc *reloc)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
reloc->offset = reloc->rel.r_offset;
|
|
||||||
reloc->type = GELF_R_TYPE(reloc->rel.r_info);
|
reloc->type = GELF_R_TYPE(reloc->rel.r_info);
|
||||||
reloc->addend = rela ? reloc->rela.r_addend : 0;
|
reloc->addend = rela ? reloc->rela.r_addend : 0;
|
||||||
|
|
||||||
|
@ -1230,7 +1231,6 @@ int elf_write_reloc(struct elf *elf, struct reloc *reloc)
|
||||||
struct section *rsec = reloc->sec;
|
struct section *rsec = reloc->sec;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
reloc->rel.r_offset = reloc->offset;
|
|
||||||
reloc->rel.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type);
|
reloc->rel.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type);
|
||||||
|
|
||||||
if (rsec->sh.sh_type == SHT_RELA) {
|
if (rsec->sh.sh_type == SHT_RELA) {
|
||||||
|
|
|
@ -75,7 +75,6 @@ struct reloc {
|
||||||
struct section *sec;
|
struct section *sec;
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
struct list_head sym_reloc_entry;
|
struct list_head sym_reloc_entry;
|
||||||
unsigned long offset;
|
|
||||||
s64 addend;
|
s64 addend;
|
||||||
unsigned int type;
|
unsigned int type;
|
||||||
bool jump_table_start;
|
bool jump_table_start;
|
||||||
|
@ -204,6 +203,11 @@ static inline unsigned int reloc_idx(struct reloc *reloc)
|
||||||
return reloc - reloc->sec->relocs;
|
return reloc - reloc->sec->relocs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline unsigned long reloc_offset(struct reloc *reloc)
|
||||||
|
{
|
||||||
|
return reloc->rel.r_offset;
|
||||||
|
}
|
||||||
|
|
||||||
#define for_each_sec(file, sec) \
|
#define for_each_sec(file, sec) \
|
||||||
list_for_each_entry(sec, &file->elf->sections, list)
|
list_for_each_entry(sec, &file->elf->sections, list)
|
||||||
|
|
||||||
|
@ -253,7 +257,7 @@ static inline u32 sec_offset_hash(struct section *sec, unsigned long offset)
|
||||||
|
|
||||||
static inline u32 reloc_hash(struct reloc *reloc)
|
static inline u32 reloc_hash(struct reloc *reloc)
|
||||||
{
|
{
|
||||||
return sec_offset_hash(reloc->sec, reloc->offset);
|
return sec_offset_hash(reloc->sec, reloc_offset(reloc));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* _OBJTOOL_ELF_H */
|
#endif /* _OBJTOOL_ELF_H */
|
||||||
|
|
Loading…
Add table
Reference in a new issue