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

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.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 945fd17a
...@@ -1116,42 +1116,29 @@ static int read_unwind_hints(struct objtool_file *file) ...@@ -1116,42 +1116,29 @@ static int read_unwind_hints(struct objtool_file *file)
static int read_retpoline_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 instruction *insn;
struct rela *rela; 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) if (!sec)
return 0; return 0;
relasec = sec->rela; list_for_each_entry(rela, &sec->rela_list, list) {
if (!relasec) { if (rela->sym->type != STT_SECTION) {
WARN("missing .rela.discard.retpoline_safe section"); WARN("unexpected relocation symbol type in %s", sec->name);
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);
return -1; return -1;
} }
insn = find_insn(file, rela->sym->sec, rela->addend); insn = find_insn(file, rela->sym->sec, rela->addend);
if (!insn) { if (!insn) {
WARN("can't find insn for retpoline_safe[%d]", i); WARN("bad .discard.retpoline_safe entry");
return -1; return -1;
} }
if (insn->type != INSN_JUMP_DYNAMIC && if (insn->type != INSN_JUMP_DYNAMIC &&
insn->type != INSN_CALL_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); insn->sec, insn->offset);
return -1; return -1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment