Commit c087c6e7 authored by Peter Zijlstra's avatar Peter Zijlstra
Browse files

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: 627fce14 ("objtool: Add ORC unwind table generation")
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
Link: https://lkml.kernel.org/r/20220419203807.596871927@infradead.org
parent 08feafe8
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -559,12 +559,12 @@ static int add_dead_ends(struct objtool_file *file)
		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%x",
				WARN("can't find unreachable insn at %s+0x%lx",
				     reloc->sym->sec->name, reloc->addend);
				return -1;
			}
		} else {
			WARN("can't find unreachable insn at %s+0x%x",
			WARN("can't find unreachable insn at %s+0x%lx",
			     reloc->sym->sec->name, reloc->addend);
			return -1;
		}
@@ -594,12 +594,12 @@ static int add_dead_ends(struct objtool_file *file)
		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%x",
				WARN("can't find reachable insn at %s+0x%lx",
				     reloc->sym->sec->name, reloc->addend);
				return -1;
			}
		} else {
			WARN("can't find reachable insn at %s+0x%x",
			WARN("can't find reachable insn at %s+0x%lx",
			     reloc->sym->sec->name, reloc->addend);
			return -1;
		}
+1 −1
Original line number Diff line number Diff line
@@ -546,7 +546,7 @@ static struct section *elf_create_reloc_section(struct elf *elf,
						int reltype);

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

+2 −2
Original line number Diff line number Diff line
@@ -73,7 +73,7 @@ struct reloc {
	struct symbol *sym;
	unsigned long offset;
	unsigned int type;
	int addend;
	long addend;
	int idx;
	bool jump_table_start;
};
@@ -135,7 +135,7 @@ struct elf *elf_open_read(const char *name, int flags);
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, int addend);
		  unsigned int type, struct symbol *sym, 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);