]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
objtool: Fix 32-bit build
authorJosh Poimboeuf <jpoimboe@redhat.com>
Tue, 6 Mar 2018 23:58:15 +0000 (17:58 -0600)
committerThadeu Lima de Souza Cascardo <cascardo@canonical.com>
Thu, 15 Mar 2018 21:29:09 +0000 (18:29 -0300)
BugLink: http://bugs.launchpad.net/bugs/1756100
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>
Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
tools/objtool/check.c

index 4cf4c800bb5537e9bfe8aa850640e40b24d6cefb..9d01d0b1084e28bd911a36bbfde171b5e1a310c1 100644 (file)
@@ -1115,42 +1115,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;
                }