From: Greg Kroah-Hartman Date: Fri, 16 Mar 2018 12:49:14 +0000 (+0100) Subject: 4.14-stable patches X-Git-Tag: v3.18.100~16 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=258b370d4d4c5118a378842f0dfd8200c6570b4b;p=thirdparty%2Fkernel%2Fstable-queue.git 4.14-stable patches added patches: x86-treat-r_x86_64_plt32-as-r_x86_64_pc32.patch --- diff --git a/queue-4.14/series b/queue-4.14/series index 5ccb0ea8f36..76f2a0cf42e 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -1,2 +1,3 @@ net-phy-fix-resume-handling.patch net-phy-restore-phy_resume-locking-assumption.patch +x86-treat-r_x86_64_plt32-as-r_x86_64_pc32.patch diff --git a/queue-4.14/x86-treat-r_x86_64_plt32-as-r_x86_64_pc32.patch b/queue-4.14/x86-treat-r_x86_64_plt32-as-r_x86_64_pc32.patch new file mode 100644 index 00000000000..285ef6758dc --- /dev/null +++ b/queue-4.14/x86-treat-r_x86_64_plt32-as-r_x86_64_pc32.patch @@ -0,0 +1,88 @@ +From b21ebf2fb4cde1618915a97cc773e287ff49173e Mon Sep 17 00:00:00 2001 +From: "H.J. Lu" +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 + +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 +Signed-off-by: Linus Torvalds +Cc: Matthias Kaehlcke +Signed-off-by: Greg Kroah-Hartman + +--- + 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);