From 11699ea9ec43cc1f63599132b9c768dd8405bb9b Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 8 Feb 2021 09:53:15 +0100 Subject: [PATCH] 4.14-stable patches added patches: elfcore-fix-building-with-clang.patch objtool-support-clang-non-section-symbols-in-orc-generation.patch --- .../elfcore-fix-building-with-clang.patch | 110 ++++++++++++++++++ ...on-section-symbols-in-orc-generation.patch | 90 ++++++++++++++ queue-4.14/series | 2 + 3 files changed, 202 insertions(+) create mode 100644 queue-4.14/elfcore-fix-building-with-clang.patch create mode 100644 queue-4.14/objtool-support-clang-non-section-symbols-in-orc-generation.patch diff --git a/queue-4.14/elfcore-fix-building-with-clang.patch b/queue-4.14/elfcore-fix-building-with-clang.patch new file mode 100644 index 00000000000..f99420181b4 --- /dev/null +++ b/queue-4.14/elfcore-fix-building-with-clang.patch @@ -0,0 +1,110 @@ +From 6e7b64b9dd6d96537d816ea07ec26b7dedd397b9 Mon Sep 17 00:00:00 2001 +From: Arnd Bergmann +Date: Fri, 11 Dec 2020 13:36:46 -0800 +Subject: elfcore: fix building with clang + +From: Arnd Bergmann + +commit 6e7b64b9dd6d96537d816ea07ec26b7dedd397b9 upstream. + +kernel/elfcore.c only contains weak symbols, which triggers a bug with +clang in combination with recordmcount: + + Cannot find symbol for section 2: .text. + kernel/elfcore.o: failed + +Move the empty stubs into linux/elfcore.h as inline functions. As only +two architectures use these, just use the architecture specific Kconfig +symbols to key off the declaration. + +Link: https://lkml.kernel.org/r/20201204165742.3815221-2-arnd@kernel.org +Signed-off-by: Arnd Bergmann +Cc: Nathan Chancellor +Cc: Nick Desaulniers +Cc: Barret Rhoden +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman +--- + include/linux/elfcore.h | 22 ++++++++++++++++++++++ + kernel/Makefile | 1 - + kernel/elfcore.c | 26 -------------------------- + 3 files changed, 22 insertions(+), 27 deletions(-) + delete mode 100644 kernel/elfcore.c + +--- a/include/linux/elfcore.h ++++ b/include/linux/elfcore.h +@@ -58,6 +58,7 @@ static inline int elf_core_copy_task_xfp + } + #endif + ++#if defined(CONFIG_UM) || defined(CONFIG_IA64) + /* + * These functions parameterize elf_core_dump in fs/binfmt_elf.c to write out + * extra segments containing the gate DSO contents. Dumping its +@@ -72,5 +73,26 @@ elf_core_write_extra_phdrs(struct coredu + extern int + elf_core_write_extra_data(struct coredump_params *cprm); + extern size_t elf_core_extra_data_size(void); ++#else ++static inline Elf_Half elf_core_extra_phdrs(void) ++{ ++ return 0; ++} ++ ++static inline int elf_core_write_extra_phdrs(struct coredump_params *cprm, loff_t offset) ++{ ++ return 1; ++} ++ ++static inline int elf_core_write_extra_data(struct coredump_params *cprm) ++{ ++ return 1; ++} ++ ++static inline size_t elf_core_extra_data_size(void) ++{ ++ return 0; ++} ++#endif + + #endif /* _LINUX_ELFCORE_H */ +--- a/kernel/Makefile ++++ b/kernel/Makefile +@@ -90,7 +90,6 @@ obj-$(CONFIG_TASK_DELAY_ACCT) += delayac + obj-$(CONFIG_TASKSTATS) += taskstats.o tsacct.o + obj-$(CONFIG_TRACEPOINTS) += tracepoint.o + obj-$(CONFIG_LATENCYTOP) += latencytop.o +-obj-$(CONFIG_ELFCORE) += elfcore.o + obj-$(CONFIG_FUNCTION_TRACER) += trace/ + obj-$(CONFIG_TRACING) += trace/ + obj-$(CONFIG_TRACE_CLOCK) += trace/ +--- a/kernel/elfcore.c ++++ /dev/null +@@ -1,26 +0,0 @@ +-// SPDX-License-Identifier: GPL-2.0 +-#include +-#include +-#include +-#include +-#include +- +-Elf_Half __weak elf_core_extra_phdrs(void) +-{ +- return 0; +-} +- +-int __weak elf_core_write_extra_phdrs(struct coredump_params *cprm, loff_t offset) +-{ +- return 1; +-} +- +-int __weak elf_core_write_extra_data(struct coredump_params *cprm) +-{ +- return 1; +-} +- +-size_t __weak elf_core_extra_data_size(void) +-{ +- return 0; +-} diff --git a/queue-4.14/objtool-support-clang-non-section-symbols-in-orc-generation.patch b/queue-4.14/objtool-support-clang-non-section-symbols-in-orc-generation.patch new file mode 100644 index 00000000000..fe5104982ff --- /dev/null +++ b/queue-4.14/objtool-support-clang-non-section-symbols-in-orc-generation.patch @@ -0,0 +1,90 @@ +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 +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 +@@ -98,11 +98,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)); +@@ -115,8 +110,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); + diff --git a/queue-4.14/series b/queue-4.14/series index 44a5d441db4..9211f09f608 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -4,3 +4,5 @@ usb-serial-option-adding-support-for-cinterion-mv31.patch input-i8042-unbreak-pegatron-c15b.patch arm64-dts-ls1046a-fix-dcfg-address-range.patch net-lapb-copy-the-skb-before-sending-a-packet.patch +objtool-support-clang-non-section-symbols-in-orc-generation.patch +elfcore-fix-building-with-clang.patch -- 2.47.3