lkml.org 
[lkml]   [2021]   [Mar]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v2 07/14] objtool: Rework rebuild_reloc logic
    Instead of manually calling elf_rebuild_reloc_section() on sections
    we've called elf_add_reloc() on, have elf_write() DTRT.

    This makes it easier to add random relocations in places without
    carefully tracking when we're done and need to flush what section.

    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    ---
    tools/objtool/check.c | 6 ------
    tools/objtool/elf.c | 20 ++++++++++++++------
    tools/objtool/include/objtool/elf.h | 1 -
    tools/objtool/orc_gen.c | 3 ---
    4 files changed, 14 insertions(+), 16 deletions(-)

    --- a/tools/objtool/check.c
    +++ b/tools/objtool/check.c
    @@ -542,9 +542,6 @@ static int create_static_call_sections(s
    idx++;
    }

    - if (elf_rebuild_reloc_section(file->elf, reloc_sec))
    - return -1;
    -
    return 0;
    }

    @@ -614,9 +611,6 @@ static int create_mcount_loc_sections(st
    idx++;
    }

    - if (elf_rebuild_reloc_section(file->elf, reloc_sec))
    - return -1;
    -
    return 0;
    }

    --- a/tools/objtool/elf.c
    +++ b/tools/objtool/elf.c
    @@ -479,6 +479,8 @@ void elf_add_reloc(struct elf *elf, stru

    list_add_tail(&reloc->list, &sec->reloc_list);
    elf_hash_add(elf->reloc_hash, &reloc->hash, reloc_hash(reloc));
    +
    + sec->changed = true;
    }

    static int read_rel_reloc(struct section *sec, int i, struct reloc *reloc, unsigned int *symndx)
    @@ -558,7 +560,9 @@ static int read_relocs(struct elf *elf)
    return -1;
    }

    - elf_add_reloc(elf, reloc);
    + list_add_tail(&reloc->list, &sec->reloc_list);
    + elf_hash_add(elf->reloc_hash, &reloc->hash, reloc_hash(reloc));
    +
    nr_reloc++;
    }
    max_reloc = max(max_reloc, nr_reloc);
    @@ -873,14 +877,11 @@ static int elf_rebuild_rela_reloc_sectio
    return 0;
    }

    -int elf_rebuild_reloc_section(struct elf *elf, struct section *sec)
    +static int elf_rebuild_reloc_section(struct elf *elf, struct section *sec)
    {
    struct reloc *reloc;
    int nr;

    - sec->changed = true;
    - elf->changed = true;
    -
    nr = 0;
    list_for_each_entry(reloc, &sec->reloc_list, list)
    nr++;
    @@ -944,9 +945,15 @@ int elf_write(struct elf *elf)
    struct section *sec;
    Elf_Scn *s;

    - /* Update section headers for changed sections: */
    + /* Update changed relocation sections and section headers: */
    list_for_each_entry(sec, &elf->sections, list) {
    if (sec->changed) {
    + if (sec->reloc &&
    + elf_rebuild_reloc_section(elf, sec->reloc)) {
    + WARN_ELF("elf_rebuild_reloc_section");
    + return -1;
    + }
    +
    s = elf_getscn(elf->elf, sec->idx);
    if (!s) {
    WARN_ELF("elf_getscn");
    @@ -958,6 +965,7 @@ int elf_write(struct elf *elf)
    }

    sec->changed = false;
    + elf->changed = true;
    }
    }

    --- a/tools/objtool/include/objtool/elf.h
    +++ b/tools/objtool/include/objtool/elf.h
    @@ -142,7 +142,6 @@ struct reloc *find_reloc_by_dest_range(c
    struct symbol *find_func_containing(struct section *sec, unsigned long offset);
    void insn_to_reloc_sym_addend(struct section *sec, unsigned long offset,
    struct reloc *reloc);
    -int elf_rebuild_reloc_section(struct elf *elf, struct section *sec);

    #define for_each_sec(file, sec) \
    list_for_each_entry(sec, &file->elf->sections, list)
    --- a/tools/objtool/orc_gen.c
    +++ b/tools/objtool/orc_gen.c
    @@ -254,8 +254,5 @@ int orc_create(struct objtool_file *file
    return -1;
    }

    - if (elf_rebuild_reloc_section(file->elf, ip_rsec))
    - return -1;
    -
    return 0;
    }

    \
     
     \ /
      Last update: 2021-03-18 18:25    [W:4.234 / U:0.084 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site