diff options
author | Sami Tolvanen <samitolvanen@google.com> | 2020-10-28 18:16:26 +0100 |
---|---|---|
committer | Kees Cook <keescook@chromium.org> | 2021-02-23 21:46:56 +0100 |
commit | 18a14575ae31c5a97a5e87e961932a5016d369be (patch) | |
tree | d7ea195c1f2189a7655ccb1755175eb05ea2dd71 /tools | |
parent | objtool: Add a pass for generating __mcount_loc (diff) | |
download | linux-18a14575ae31c5a97a5e87e961932a5016d369be.tar.xz linux-18a14575ae31c5a97a5e87e961932a5016d369be.zip |
objtool: Fix __mcount_loc generation with Clang's assembler
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>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/objtool/check.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/tools/objtool/check.c b/tools/objtool/check.c index 44e3ee1425cd..ab87fb92793c 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -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; |