From: Greg Kroah-Hartman Date: Thu, 29 Oct 2020 11:34:16 +0000 (+0100) Subject: 4.19-stable patches X-Git-Tag: v4.19.154~28 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c801afb7690bf99788d4ff4a48b19507a78adfd2;p=thirdparty%2Fkernel%2Fstable-queue.git 4.19-stable patches added patches: objtool-support-clang-non-section-symbols-in-orc-generation.patch --- diff --git a/queue-4.19/objtool-support-clang-non-section-symbols-in-orc-generation.patch b/queue-4.19/objtool-support-clang-non-section-symbols-in-orc-generation.patch new file mode 100644 index 00000000000..865d5b766e6 --- /dev/null +++ b/queue-4.19/objtool-support-clang-non-section-symbols-in-orc-generation.patch @@ -0,0 +1,92 @@ +From e81e0724432542af8d8c702c31e9d82f57b1ff31 Mon Sep 17 00:00:00 2001 +From: Josh Poimboeuf +Date: Wed, 1 Apr 2020 13:23:27 -0500 +Subject: objtool: Support Clang non-section symbols in ORC generation + +From: Josh Poimboeuf + +commit e81e0724432542af8d8c702c31e9d82f57b1ff31 upstream. + +When compiling the kernel with AS=clang, objtool produces a lot of +warnings: + + warning: objtool: missing symbol for section .text + warning: objtool: missing symbol for section .init.text + warning: objtool: missing symbol for section .ref.text + +It then fails to generate the ORC table. + +The problem is that objtool assumes text section symbols always exist. +But the Clang assembler is aggressive about removing them. + +When generating relocations for the ORC table, objtool always tries to +reference instructions by their section symbol offset. If the section +symbol doesn't exist, it bails. + +Do a fallback: when a section symbol isn't available, reference a +function symbol instead. + +Reported-by: Dmitry Golovin +Signed-off-by: Josh Poimboeuf +Signed-off-by: Borislav Petkov +Tested-by: Nathan Chancellor +Reviewed-by: Miroslav Benes +Acked-by: Peter Zijlstra (Intel) +Link: https://github.com/ClangBuiltLinux/linux/issues/669 +Link: https://lkml.kernel.org/r/9a9cae7fcf628843aabe5a086b1a3c5bf50f42e8.1585761021.git.jpoimboe@redhat.com +Cc: Nick Desaulniers +Signed-off-by: Greg Kroah-Hartman + +--- + tools/objtool/orc_gen.c | 33 ++++++++++++++++++++++++++------- + 1 file changed, 26 insertions(+), 7 deletions(-) + +--- a/tools/objtool/orc_gen.c ++++ b/tools/objtool/orc_gen.c +@@ -100,11 +100,6 @@ static int create_orc_entry(struct secti + struct orc_entry *orc; + struct rela *rela; + +- if (!insn_sec->sym) { +- WARN("missing symbol for section %s", insn_sec->name); +- return -1; +- } +- + /* populate ORC data */ + orc = (struct orc_entry *)u_sec->data->d_buf + idx; + memcpy(orc, o, sizeof(*orc)); +@@ -117,8 +112,32 @@ static int create_orc_entry(struct secti + } + memset(rela, 0, sizeof(*rela)); + +- rela->sym = insn_sec->sym; +- rela->addend = insn_off; ++ if (insn_sec->sym) { ++ rela->sym = insn_sec->sym; ++ rela->addend = insn_off; ++ } else { ++ /* ++ * The Clang assembler doesn't produce section symbols, so we ++ * have to reference the function symbol instead: ++ */ ++ rela->sym = find_symbol_containing(insn_sec, insn_off); ++ if (!rela->sym) { ++ /* ++ * Hack alert. This happens when we need to reference ++ * the NOP pad insn immediately after the function. ++ */ ++ rela->sym = find_symbol_containing(insn_sec, ++ insn_off - 1); ++ } ++ if (!rela->sym) { ++ WARN("missing symbol for insn at offset 0x%lx\n", ++ insn_off); ++ return -1; ++ } ++ ++ rela->addend = insn_off - rela->sym->offset; ++ } ++ + rela->type = R_X86_64_PC32; + rela->offset = idx * sizeof(int); +