Messages in this thread Patch in this message | | | Date | Mon, 16 May 2022 11:06:36 -0400 (EDT) | From | Mikulas Patocka <> | Subject | [PATCH] objtool: fix objtool regression on x32 systems |
| |
The patch 4abff6d48dbc ("objtool: Fix code relocs vs weak symbols") makes the kernel unbootable. The patch c087c6e7b551 ("objtool: Fix type of reloc::addend") attempts to fix it by replacing 'int' with 'long'.
However, we may be running on a system with x32 ABI and 'long' on x32 is 32-bit, thus the patch c087c6e7b551 doesn't really change anything and we still end up with miscompiled kernel. This patch replaces 'long' with 'long long', so that the 64-bit kernel is correctly compiled on a x32 system.
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Fixes: 4abff6d48dbc ("objtool: Fix code relocs vs weak symbols") Fixes: c087c6e7b551 ("objtool: Fix type of reloc::addend")
--- tools/objtool/check.c | 8 ++++---- tools/objtool/elf.c | 2 +- tools/objtool/include/objtool/elf.h | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-)
Index: linux-2.6/tools/objtool/check.c =================================================================== --- linux-2.6.orig/tools/objtool/check.c 2022-05-16 16:20:49.000000000 +0200 +++ linux-2.6/tools/objtool/check.c 2022-05-16 16:22:11.000000000 +0200 @@ -560,12 +560,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%llx", 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%llx", reloc->sym->sec->name, reloc->addend); return -1; } @@ -595,12 +595,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%llx", 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%llx", reloc->sym->sec->name, reloc->addend); return -1; } Index: linux-2.6/tools/objtool/elf.c =================================================================== --- linux-2.6.orig/tools/objtool/elf.c 2022-05-16 16:20:49.000000000 +0200 +++ linux-2.6/tools/objtool/elf.c 2022-05-16 16:22:21.000000000 +0200 @@ -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, long long addend) { struct reloc *reloc; Index: linux-2.6/tools/objtool/include/objtool/elf.h =================================================================== --- linux-2.6.orig/tools/objtool/include/objtool/elf.h 2022-05-16 16:07:54.000000000 +0200 +++ linux-2.6/tools/objtool/include/objtool/elf.h 2022-05-16 16:22:45.000000000 +0200 @@ -73,7 +73,7 @@ struct reloc { struct symbol *sym; unsigned long offset; unsigned int type; - long addend; + long long 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, long long 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);
| |