objtool: Fix type of reloc::addend

Elf{32,64}_Rela::r_addend is of type: Elf{32,64}_Sword, that means
that our reloc::addend needs to be long or face tuncation issues when
we do elf_rebuild_reloc_section():

- 107: 48 b8 00 00 00 00 00 00 00 00 movabs $0x0,%rax 109: R_X86_64_64 level4_kernel_pgt+0x80000067
+ 107: 48 b8 00 00 00 00 00 00 00 00 movabs $0x0,%rax 109: R_X86_64_64 level4_kernel_pgt-0x7fffff99

Fixes: 627fce14809b ("objtool: Add ORC unwind table generation")
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Josh Poimboeuf <jpoimboe@redhat.com>
Link: https://lkml.kernel.org/r/20220419203807.596871927@infradead.org

Changed files
+7 -7
tools
objtool
include
objtool
+4 -4
tools/objtool/check.c
··· 559 559 else if (reloc->addend == reloc->sym->sec->sh.sh_size) { 560 560 insn = find_last_insn(file, reloc->sym->sec); 561 561 if (!insn) { 562 - WARN("can't find unreachable insn at %s+0x%x", 562 + WARN("can't find unreachable insn at %s+0x%lx", 563 563 reloc->sym->sec->name, reloc->addend); 564 564 return -1; 565 565 } 566 566 } else { 567 - WARN("can't find unreachable insn at %s+0x%x", 567 + WARN("can't find unreachable insn at %s+0x%lx", 568 568 reloc->sym->sec->name, reloc->addend); 569 569 return -1; 570 570 } ··· 594 594 else if (reloc->addend == reloc->sym->sec->sh.sh_size) { 595 595 insn = find_last_insn(file, reloc->sym->sec); 596 596 if (!insn) { 597 - WARN("can't find reachable insn at %s+0x%x", 597 + WARN("can't find reachable insn at %s+0x%lx", 598 598 reloc->sym->sec->name, reloc->addend); 599 599 return -1; 600 600 } 601 601 } else { 602 - WARN("can't find reachable insn at %s+0x%x", 602 + WARN("can't find reachable insn at %s+0x%lx", 603 603 reloc->sym->sec->name, reloc->addend); 604 604 return -1; 605 605 }
+1 -1
tools/objtool/elf.c
··· 546 546 int reltype); 547 547 548 548 int elf_add_reloc(struct elf *elf, struct section *sec, unsigned long offset, 549 - unsigned int type, struct symbol *sym, int addend) 549 + unsigned int type, struct symbol *sym, long addend) 550 550 { 551 551 struct reloc *reloc; 552 552
+2 -2
tools/objtool/include/objtool/elf.h
··· 73 73 struct symbol *sym; 74 74 unsigned long offset; 75 75 unsigned int type; 76 - int addend; 76 + long addend; 77 77 int idx; 78 78 bool jump_table_start; 79 79 }; ··· 135 135 struct section *elf_create_section(struct elf *elf, const char *name, unsigned int sh_flags, size_t entsize, int nr); 136 136 137 137 int elf_add_reloc(struct elf *elf, struct section *sec, unsigned long offset, 138 - unsigned int type, struct symbol *sym, int addend); 138 + unsigned int type, struct symbol *sym, long addend); 139 139 int elf_add_reloc_to_insn(struct elf *elf, struct section *sec, 140 140 unsigned long offset, unsigned int type, 141 141 struct section *insn_sec, unsigned long insn_off);