objtool: Fix __mcount_loc generation with Clang's assembler
authorSami Tolvanen <samitolvanen@google.com>
Wed, 28 Oct 2020 17:16:26 +0000 (10:16 -0700)
committerKees Cook <keescook@chromium.org>
Tue, 23 Feb 2021 20:46:56 +0000 (12:46 -0800)
When objtool generates relocations for the __mcount_loc section, it
tries to reference __fentry__ calls by their section symbol offset.
However, this fails with Clang's integrated assembler as it may not
generate section symbols for every section. This patch looks up a
function symbol instead if the section symbol is missing, similarly
to commit e81e07244325 ("objtool: Support Clang non-section symbols
in ORC generation").

Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
tools/objtool/check.c

index 44e3ee1..ab87fb9 100644 (file)
@@ -573,8 +573,21 @@ static int create_mcount_loc_sections(struct objtool_file *file)
                }
                memset(reloc, 0, sizeof(*reloc));
 
-               reloc->sym = insn->sec->sym;
-               reloc->addend = insn->offset;
+               if (insn->sec->sym) {
+                       reloc->sym = insn->sec->sym;
+                       reloc->addend = insn->offset;
+               } else {
+                       reloc->sym = find_symbol_containing(insn->sec, insn->offset);
+
+                       if (!reloc->sym) {
+                               WARN("missing symbol for insn at offset 0x%lx\n",
+                                    insn->offset);
+                               return -1;
+                       }
+
+                       reloc->addend = insn->offset - reloc->sym->offset;
+               }
+
                reloc->type = R_X86_64_64;
                reloc->offset = idx * sizeof(unsigned long);
                reloc->sec = reloc_sec;