]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.19-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 29 Oct 2020 11:34:16 +0000 (12:34 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 29 Oct 2020 11:34:16 +0000 (12:34 +0100)
added patches:
objtool-support-clang-non-section-symbols-in-orc-generation.patch

queue-4.19/objtool-support-clang-non-section-symbols-in-orc-generation.patch [new file with mode: 0644]

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 (file)
index 0000000..865d5b7
--- /dev/null
@@ -0,0 +1,92 @@
+From e81e0724432542af8d8c702c31e9d82f57b1ff31 Mon Sep 17 00:00:00 2001
+From: Josh Poimboeuf <jpoimboe@redhat.com>
+Date: Wed, 1 Apr 2020 13:23:27 -0500
+Subject: objtool: Support Clang non-section symbols in ORC generation
+
+From: Josh Poimboeuf <jpoimboe@redhat.com>
+
+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 <dima@golovin.in>
+Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
+Signed-off-by: Borislav Petkov <bp@suse.de>
+Tested-by: Nathan Chancellor <natechancellor@gmail.com>
+Reviewed-by: Miroslav Benes <mbenes@suse.cz>
+Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Link: https://github.com/ClangBuiltLinux/linux/issues/669
+Link: https://lkml.kernel.org/r/9a9cae7fcf628843aabe5a086b1a3c5bf50f42e8.1585761021.git.jpoimboe@redhat.com
+Cc: Nick Desaulniers <ndesaulniers@google.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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);