lkml.org 
[lkml]   [2022]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.18 717/879] objtool: Fix objtool regression on x32 systems
    Date
    From: Mikulas Patocka <mpatocka@redhat.com>

    commit 22682a07acc308ef78681572e19502ce8893c4d4 upstream.

    Commit c087c6e7b551 ("objtool: Fix type of reloc::addend") failed to
    appreciate cross building from ILP32 hosts, where 'int' == 'long' and
    the issue persists.

    As such, use s64/int64_t/Elf64_Sxword for this field and suffer the
    pain that is ISO C99 printf formats for it.

    Fixes: c087c6e7b551 ("objtool: Fix type of reloc::addend")
    Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
    [peterz: reword changelog, s/long long/s64/]
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Cc: <stable@vger.kernel.org>
    Link: https://lkml.kernel.org/r/alpine.LRH.2.02.2205161041260.11556@file01.intranet.prod.int.rdu2.redhat.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    tools/objtool/check.c | 9 +++++----
    tools/objtool/elf.c | 2 +-
    tools/objtool/include/objtool/elf.h | 4 ++--
    3 files changed, 8 insertions(+), 7 deletions(-)

    --- a/tools/objtool/check.c
    +++ b/tools/objtool/check.c
    @@ -5,6 +5,7 @@

    #include <string.h>
    #include <stdlib.h>
    +#include <inttypes.h>
    #include <sys/mman.h>

    #include <arch/elf.h>
    @@ -560,12 +561,12 @@ static int add_dead_ends(struct objtool_
    else if (reloc->addend == reloc->sym->sec->sh.sh_size) {
    insn = find_last_insn(file, reloc->sym->sec);
    if (!insn) {
    - WARN("can't find unreachable insn at %s+0x%lx",
    + WARN("can't find unreachable insn at %s+0x%" PRIx64,
    reloc->sym->sec->name, reloc->addend);
    return -1;
    }
    } else {
    - WARN("can't find unreachable insn at %s+0x%lx",
    + WARN("can't find unreachable insn at %s+0x%" PRIx64,
    reloc->sym->sec->name, reloc->addend);
    return -1;
    }
    @@ -595,12 +596,12 @@ reachable:
    else if (reloc->addend == reloc->sym->sec->sh.sh_size) {
    insn = find_last_insn(file, reloc->sym->sec);
    if (!insn) {
    - WARN("can't find reachable insn at %s+0x%lx",
    + WARN("can't find reachable insn at %s+0x%" PRIx64,
    reloc->sym->sec->name, reloc->addend);
    return -1;
    }
    } else {
    - WARN("can't find reachable insn at %s+0x%lx",
    + WARN("can't find reachable insn at %s+0x%" PRIx64,
    reloc->sym->sec->name, reloc->addend);
    return -1;
    }
    --- a/tools/objtool/elf.c
    +++ b/tools/objtool/elf.c
    @@ -546,7 +546,7 @@ static struct section *elf_create_reloc_
    int reltype);

    int elf_add_reloc(struct elf *elf, struct section *sec, unsigned long offset,
    - unsigned int type, struct symbol *sym, long addend)
    + unsigned int type, struct symbol *sym, s64 addend)
    {
    struct reloc *reloc;

    --- a/tools/objtool/include/objtool/elf.h
    +++ b/tools/objtool/include/objtool/elf.h
    @@ -73,7 +73,7 @@ struct reloc {
    struct symbol *sym;
    unsigned long offset;
    unsigned int type;
    - long addend;
    + s64 addend;
    int idx;
    bool jump_table_start;
    };
    @@ -135,7 +135,7 @@ struct elf *elf_open_read(const char *na
    struct section *elf_create_section(struct elf *elf, const char *name, unsigned int sh_flags, size_t entsize, int nr);

    int elf_add_reloc(struct elf *elf, struct section *sec, unsigned long offset,
    - unsigned int type, struct symbol *sym, long addend);
    + unsigned int type, struct symbol *sym, s64 addend);
    int elf_add_reloc_to_insn(struct elf *elf, struct section *sec,
    unsigned long offset, unsigned int type,
    struct section *insn_sec, unsigned long insn_off);

    \
     
     \ /
      Last update: 2022-06-08 02:27    [W:4.052 / U:0.216 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site