lkml.org 
[lkml]   [2022]   [Oct]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 098/390] objtool: Preserve special st_shndx indexes in elf_update_symbol
    Date
    From: Sami Tolvanen <samitolvanen@google.com>

    [ Upstream commit 5141d3a06b2da1731ac82091298b766a1f95d3d8 ]

    elf_update_symbol fails to preserve the special st_shndx values
    between [SHN_LORESERVE, SHN_HIRESERVE], which results in it
    converting SHN_ABS entries into SHN_UNDEF, for example. Explicitly
    check for the special indexes and ensure these symbols are not
    marked undefined.

    Fixes: ead165fa1042 ("objtool: Fix symbol creation")
    Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
    Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Tested-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: Kees Cook <keescook@chromium.org>
    Link: https://lore.kernel.org/r/20220908215504.3686827-17-samitolvanen@google.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    tools/objtool/elf.c | 7 ++++++-
    1 file changed, 6 insertions(+), 1 deletion(-)

    diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c
    index 5aa3b4e76479..a2ea3931e01d 100644
    --- a/tools/objtool/elf.c
    +++ b/tools/objtool/elf.c
    @@ -578,6 +578,11 @@ static int elf_update_symbol(struct elf *elf, struct section *symtab,
    Elf64_Xword entsize = symtab->sh.sh_entsize;
    int max_idx, idx = sym->idx;
    Elf_Scn *s, *t = NULL;
    + bool is_special_shndx = sym->sym.st_shndx >= SHN_LORESERVE &&
    + sym->sym.st_shndx != SHN_XINDEX;
    +
    + if (is_special_shndx)
    + shndx = sym->sym.st_shndx;

    s = elf_getscn(elf->elf, symtab->idx);
    if (!s) {
    @@ -663,7 +668,7 @@ static int elf_update_symbol(struct elf *elf, struct section *symtab,
    }

    /* setup extended section index magic and write the symbol */
    - if (shndx >= SHN_UNDEF && shndx < SHN_LORESERVE) {
    + if ((shndx >= SHN_UNDEF && shndx < SHN_LORESERVE) || is_special_shndx) {
    sym->sym.st_shndx = shndx;
    if (!shndx_data)
    shndx = 0;
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-10-24 18:11    [W:5.435 / U:0.816 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site