]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
objtool: Get rid of reloc->offset
authorJosh Poimboeuf <jpoimboe@kernel.org>
Tue, 30 May 2023 17:21:06 +0000 (10:21 -0700)
committerJosh Poimboeuf <jpoimboe@kernel.org>
Wed, 7 Jun 2023 17:03:21 +0000 (10:03 -0700)
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>
tools/objtool/check.c
tools/objtool/elf.c
tools/objtool/include/objtool/elf.h

index e21138d36e00983bc46ad899cb0ae42110feb282..e06ffad5a93c26a73157feaa4df4d61eadd5a77c 100644 (file)
@@ -511,11 +511,11 @@ static int add_pv_ops(struct objtool_file *file, const char *symname)
                if (func->type == STT_SECTION)
                        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);
 
-               off = reloc->offset + 1;
+               off = reloc_offset(reloc) + 1;
                if (off > end)
                        break;
        }
@@ -1998,7 +1998,7 @@ static int add_jump_table(struct objtool_file *file, struct instruction *insn,
                        break;
 
                /* 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;
 
                /* 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->next = insn->alts;
                insn->alts = alt;
-               prev_offset = reloc->offset;
+               prev_offset = reloc_offset(reloc);
        }
 
        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);
             reloc;
             reloc = find_reloc_by_dest_range(file->elf, insn->sec,
-                                             reloc->offset + 1,
-                                             (insn->offset + insn->len) - (reloc->offset + 1))) {
+                                             reloc_offset(reloc) + 1,
+                                             (insn->offset + insn->len) - (reloc_offset(reloc) + 1))) {
 
                /*
                 * static_call_update() references the trampoline, which
@@ -4350,7 +4350,7 @@ static int validate_ibt_data_reloc(struct objtool_file *file,
                return 0;
 
        WARN_FUNC("data relocation to !ENDBR: %s",
-                 reloc->sec->base, reloc->offset,
+                 reloc->sec->base, reloc_offset(reloc),
                  offstr(dest->sec, dest->offset));
 
        return 1;
index 70c8012545663cb2ade2410fa756207804f8d205..2b45460225d18f2b50e8f7710e90f57edd86c275 100644 (file)
@@ -246,8 +246,9 @@ struct reloc *find_reloc_by_dest_range(const struct elf *elf, struct section *se
                        if (reloc->sec != rsec)
                                continue;
 
-                       if (reloc->offset >= offset && reloc->offset < offset + len) {
-                               if (!r || reloc->offset < r->offset)
+                       if (reloc_offset(reloc) >= offset &&
+                           reloc_offset(reloc) < offset + len) {
+                               if (!r || reloc_offset(reloc) < reloc_offset(r))
                                        r = reloc;
                        }
                }
@@ -830,11 +831,12 @@ static struct reloc *elf_init_reloc(struct elf *elf, struct section *rsec,
        }
 
        reloc->sec = rsec;
-       reloc->offset = offset;
        reloc->type = type;
        reloc->sym = sym;
        reloc->addend = addend;
 
+       reloc->rel.r_offset = offset;
+
        if (elf_write_reloc(elf, reloc))
                return NULL;
 
@@ -908,7 +910,6 @@ static int read_reloc(struct section *rsec, int i, struct reloc *reloc)
                return -1;
        }
 
-       reloc->offset = reloc->rel.r_offset;
        reloc->type = GELF_R_TYPE(reloc->rel.r_info);
        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;
        int ret;
 
-       reloc->rel.r_offset = reloc->offset;
        reloc->rel.r_info = GELF_R_INFO(reloc->sym->idx, reloc->type);
 
        if (rsec->sh.sh_type == SHT_RELA) {
index 2a14da633d56b48c47aa42d64922dbea21f0ac56..2070860a099e26ddadfe488628b6604faed3d9c0 100644 (file)
@@ -75,7 +75,6 @@ struct reloc {
        struct section *sec;
        struct symbol *sym;
        struct list_head sym_reloc_entry;
-       unsigned long offset;
        s64 addend;
        unsigned int type;
        bool jump_table_start;
@@ -204,6 +203,11 @@ static inline unsigned int reloc_idx(struct reloc *reloc)
        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)                                                \
        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)
 {
-       return sec_offset_hash(reloc->sec, reloc->offset);
+       return sec_offset_hash(reloc->sec, reloc_offset(reloc));
 }
 
 #endif /* _OBJTOOL_ELF_H */