]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.15-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 16 Mar 2018 12:49:32 +0000 (13:49 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 16 Mar 2018 12:49:32 +0000 (13:49 +0100)
added patches:
x86-treat-r_x86_64_plt32-as-r_x86_64_pc32.patch

queue-4.15/series
queue-4.15/x86-treat-r_x86_64_plt32-as-r_x86_64_pc32.patch [new file with mode: 0644]

index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..ff247a772424d8bef32f71d23746a21cf12355f0 100644 (file)
@@ -0,0 +1 @@
+x86-treat-r_x86_64_plt32-as-r_x86_64_pc32.patch
diff --git a/queue-4.15/x86-treat-r_x86_64_plt32-as-r_x86_64_pc32.patch b/queue-4.15/x86-treat-r_x86_64_plt32-as-r_x86_64_pc32.patch
new file mode 100644 (file)
index 0000000..285ef67
--- /dev/null
@@ -0,0 +1,88 @@
+From b21ebf2fb4cde1618915a97cc773e287ff49173e Mon Sep 17 00:00:00 2001
+From: "H.J. Lu" <hjl.tools@gmail.com>
+Date: Wed, 7 Feb 2018 14:20:09 -0800
+Subject: x86: Treat R_X86_64_PLT32 as R_X86_64_PC32
+
+From: H.J. Lu <hjl.tools@gmail.com>
+
+commit b21ebf2fb4cde1618915a97cc773e287ff49173e upstream.
+
+On i386, there are 2 types of PLTs, PIC and non-PIC.  PIE and shared
+objects must use PIC PLT.  To use PIC PLT, you need to load
+_GLOBAL_OFFSET_TABLE_ into EBX first.  There is no need for that on
+x86-64 since x86-64 uses PC-relative PLT.
+
+On x86-64, for 32-bit PC-relative branches, we can generate PLT32
+relocation, instead of PC32 relocation, which can also be used as
+a marker for 32-bit PC-relative branches.  Linker can always reduce
+PLT32 relocation to PC32 if function is defined locally.   Local
+functions should use PC32 relocation.  As far as Linux kernel is
+concerned, R_X86_64_PLT32 can be treated the same as R_X86_64_PC32
+since Linux kernel doesn't use PLT.
+
+R_X86_64_PLT32 for 32-bit PC-relative branches has been enabled in
+binutils master branch which will become binutils 2.31.
+
+[ hjl is working on having better documentation on this all, but a few
+  more notes from him:
+
+   "PLT32 relocation is used as marker for PC-relative branches. Because
+    of EBX, it looks odd to generate PLT32 relocation on i386 when EBX
+    doesn't have GOT.
+
+    As for symbol resolution, PLT32 and PC32 relocations are almost
+    interchangeable. But when linker sees PLT32 relocation against a
+    protected symbol, it can resolved locally at link-time since it is
+    used on a branch instruction. Linker can't do that for PC32
+    relocation"
+
+  but for the kernel use, the two are basically the same, and this
+  commit gets things building and working with the current binutils
+  master   - Linus ]
+
+Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Matthias Kaehlcke <mka@chromium.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/x86/kernel/machine_kexec_64.c |    1 +
+ arch/x86/kernel/module.c           |    1 +
+ arch/x86/tools/relocs.c            |    3 +++
+ 3 files changed, 5 insertions(+)
+
+--- a/arch/x86/kernel/machine_kexec_64.c
++++ b/arch/x86/kernel/machine_kexec_64.c
+@@ -542,6 +542,7 @@ int arch_kexec_apply_relocations_add(con
+                               goto overflow;
+                       break;
+               case R_X86_64_PC32:
++              case R_X86_64_PLT32:
+                       value -= (u64)address;
+                       *(u32 *)location = value;
+                       break;
+--- a/arch/x86/kernel/module.c
++++ b/arch/x86/kernel/module.c
+@@ -191,6 +191,7 @@ int apply_relocate_add(Elf64_Shdr *sechd
+                               goto overflow;
+                       break;
+               case R_X86_64_PC32:
++              case R_X86_64_PLT32:
+                       if (*(u32 *)loc != 0)
+                               goto invalid_relocation;
+                       val -= (u64)loc;
+--- a/arch/x86/tools/relocs.c
++++ b/arch/x86/tools/relocs.c
+@@ -770,9 +770,12 @@ static int do_reloc64(struct section *se
+               break;
+       case R_X86_64_PC32:
++      case R_X86_64_PLT32:
+               /*
+                * PC relative relocations don't need to be adjusted unless
+                * referencing a percpu symbol.
++               *
++               * NB: R_X86_64_PLT32 can be treated as R_X86_64_PC32.
+                */
+               if (is_percpu_sym(sym, symname))
+                       add_reloc(&relocs32neg, offset);