Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 63474dc4 authored by Josh Poimboeuf's avatar Josh Poimboeuf Committed by Ingo Molnar
Browse files

objtool: Fix 32-bit build



Fix the objtool build when cross-compiling a 64-bit kernel on a 32-bit
host.  This also simplifies read_retpoline_hints() a bit and makes its
implementation similar to most of the other annotation reading
functions.

Reported-by: default avatarSven Joachim <svenjoac@gmx.de>
Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Fixes: b5bc2231 ("objtool: Add retpoline validation")
Link: http://lkml.kernel.org/r/2ca46c636c23aa9c9d57d53c75de4ee3ddf7a7df.1520380691.git.jpoimboe@redhat.com


Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 945fd17a
Loading
Loading
Loading
Loading
+7 −20
Original line number Diff line number Diff line
@@ -1116,42 +1116,29 @@ static int read_unwind_hints(struct objtool_file *file)

static int read_retpoline_hints(struct objtool_file *file)
{
	struct section *sec, *relasec;
	struct section *sec;
	struct instruction *insn;
	struct rela *rela;
	int i;

	sec = find_section_by_name(file->elf, ".discard.retpoline_safe");
	sec = find_section_by_name(file->elf, ".rela.discard.retpoline_safe");
	if (!sec)
		return 0;

	relasec = sec->rela;
	if (!relasec) {
		WARN("missing .rela.discard.retpoline_safe section");
		return -1;
	}

	if (sec->len % sizeof(unsigned long)) {
		WARN("retpoline_safe size mismatch: %d %ld", sec->len, sizeof(unsigned long));
		return -1;
	}

	for (i = 0; i < sec->len / sizeof(unsigned long); i++) {
		rela = find_rela_by_dest(sec, i * sizeof(unsigned long));
		if (!rela) {
			WARN("can't find rela for retpoline_safe[%d]", i);
	list_for_each_entry(rela, &sec->rela_list, list) {
		if (rela->sym->type != STT_SECTION) {
			WARN("unexpected relocation symbol type in %s", sec->name);
			return -1;
		}

		insn = find_insn(file, rela->sym->sec, rela->addend);
		if (!insn) {
			WARN("can't find insn for retpoline_safe[%d]", i);
			WARN("bad .discard.retpoline_safe entry");
			return -1;
		}

		if (insn->type != INSN_JUMP_DYNAMIC &&
		    insn->type != INSN_CALL_DYNAMIC) {
			WARN_FUNC("retpoline_safe hint not a indirect jump/call",
			WARN_FUNC("retpoline_safe hint not an indirect jump/call",
				  insn->sec, insn->offset);
			return -1;
		}