| From 63474dc4ac7ed3848a4786b9592dd061901f606d Mon Sep 17 00:00:00 2001 |
| From: Josh Poimboeuf <jpoimboe@redhat.com> |
| Date: Tue, 6 Mar 2018 17:58:15 -0600 |
| Subject: objtool: Fix 32-bit build |
| |
| From: Josh Poimboeuf <jpoimboe@redhat.com> |
| |
| commit 63474dc4ac7ed3848a4786b9592dd061901f606d upstream. |
| |
| 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: Sven Joachim <svenjoac@gmx.de> |
| Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com> |
| Cc: Linus Torvalds <torvalds@linux-foundation.org> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Fixes: b5bc2231b8ad ("objtool: Add retpoline validation") |
| Link: http://lkml.kernel.org/r/2ca46c636c23aa9c9d57d53c75de4ee3ddf7a7df.1520380691.git.jpoimboe@redhat.com |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| tools/objtool/check.c | 27 +++++++-------------------- |
| 1 file changed, 7 insertions(+), 20 deletions(-) |
| |
| --- a/tools/objtool/check.c |
| +++ b/tools/objtool/check.c |
| @@ -1115,42 +1115,29 @@ static int read_unwind_hints(struct objt |
| |
| 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; |
| } |