summary refs log tree commit diff
path: root/tools/objtool
diff options
context:
space:
mode:
authorSami Tolvanen <samitolvanen@google.com>2020-10-28 10:16:26 -0700
committerKees Cook <keescook@chromium.org>2021-02-23 12:46:56 -0800
commit18a14575ae31c5a97a5e87e961932a5016d369be (patch)
treed7ea195c1f2189a7655ccb1755175eb05ea2dd71 /tools/objtool
parent99d0021569c71c325f41a7dd0a08a380010ce95c (diff)
downloadlinux-18a14575ae31c5a97a5e87e961932a5016d369be.tar.gz
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/objtool')
-rw-r--r--tools/objtool/check.c17
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;