diff options
Diffstat (limited to '0000-unknown-rela-relocation-4-binutils.2.31.kernel.3.16.patch')
-rw-r--r-- | 0000-unknown-rela-relocation-4-binutils.2.31.kernel.3.16.patch | 94 |
1 files changed, 0 insertions, 94 deletions
diff --git a/0000-unknown-rela-relocation-4-binutils.2.31.kernel.3.16.patch b/0000-unknown-rela-relocation-4-binutils.2.31.kernel.3.16.patch deleted file mode 100644 index 6578beb82dcd..000000000000 --- a/0000-unknown-rela-relocation-4-binutils.2.31.kernel.3.16.patch +++ /dev/null @@ -1,94 +0,0 @@ -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 - -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> ---- - 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(+) - -# File not present in linux-3.16 -#diff --git a/arch/x86/kernel/machine_kexec_64.c b/arch/x86/kernel/machine_kexec_64.c -#index 1f790cf9d38f..3b7427aa7d85 100644 -#--- 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(const Elf64_Ehdr *ehdr, -# goto overflow; -# break; -# case R_X86_64_PC32: -#+ case R_X86_64_PLT32: -# value -= (u64)address; -# *(u32 *)location = value; -# break; -diff -pNaru5 linux-3.16.61.orig/arch/x86/kernel/module.c linux-3.16/arch/x86/kernel/module.c ---- linux-3.16.61.orig/arch/x86/kernel/module.c 2014-08-03 18:25:02.000000000 -0400 -+++ linux-3.16/arch/x86/kernel/module.c 2018-12-02 20:13:13.245493421 -0500 -@@ -178,10 +178,11 @@ int apply_relocate_add(Elf64_Shdr *sechd - *(s32 *)loc = val; - if ((s64)val != *(s32 *)loc) - goto overflow; - break; - case R_X86_64_PC32: -+ case R_X86_64_PLT32: - val -= (u64)loc; - *(u32 *)loc = val; - #if 0 - if ((s64)val != *(s32 *)loc) - goto overflow; -diff -pNaru5 linux-3.16.61.orig/arch/x86/tools/relocs.c linux-3.16/arch/x86/tools/relocs.c ---- linux-3.16.61.orig/arch/x86/tools/relocs.c 2018-12-02 20:13:11.958832565 -0500 -+++ linux-3.16/arch/x86/tools/relocs.c 2018-12-02 20:13:13.245493421 -0500 -@@ -761,13 +761,16 @@ static int do_reloc64(struct section *se - offset += per_cpu_load_addr; - - switch (r_type) { - case R_X86_64_NONE: - case R_X86_64_PC32: -+ case R_X86_64_PLT32: - /* - * NONE can be ignored and PC relative relocations don't - * need to be adjusted. -+ * -+ * NB: R_X86_64_PLT32 can be treated as R_X86_64_PC32. - */ - break; - - case R_X86_64_32: - case R_X86_64_32S: |