summaryrefslogtreecommitdiff
path: root/0013-powerpc-Fix-ld.so-address-determination-for-PCREL-mo.patch
diff options
context:
space:
mode:
Diffstat (limited to '0013-powerpc-Fix-ld.so-address-determination-for-PCREL-mo.patch')
-rw-r--r--0013-powerpc-Fix-ld.so-address-determination-for-PCREL-mo.patch56
1 files changed, 56 insertions, 0 deletions
diff --git a/0013-powerpc-Fix-ld.so-address-determination-for-PCREL-mo.patch b/0013-powerpc-Fix-ld.so-address-determination-for-PCREL-mo.patch
new file mode 100644
index 0000000..526dc2c
--- /dev/null
+++ b/0013-powerpc-Fix-ld.so-address-determination-for-PCREL-mo.patch
@@ -0,0 +1,56 @@
+From 20534f81760635f3a71fb11ba251568cdc11c6a0 Mon Sep 17 00:00:00 2001
+From: Florian Weimer <fweimer@redhat.com>
+Date: Sun, 14 Apr 2024 08:24:51 +0200
+Subject: [PATCH 13/26] powerpc: Fix ld.so address determination for PCREL mode
+ (bug 31640)
+
+This seems to have stopped working with some GCC 14 versions,
+which clobber r2. With other compilers, the kernel-provided
+r2 value is still available at this point.
+
+Reviewed-by: Peter Bergner <bergner@linux.ibm.com>
+(cherry picked from commit 14e56bd4ce15ac2d1cc43f762eb2e6b83fec1afe)
+---
+ sysdeps/powerpc/powerpc64/dl-machine.h | 19 +++++++++++++++++++
+ 1 file changed, 19 insertions(+)
+
+diff --git a/sysdeps/powerpc/powerpc64/dl-machine.h b/sysdeps/powerpc/powerpc64/dl-machine.h
+index 9b8943bc91..7fa8a355b5 100644
+--- a/sysdeps/powerpc/powerpc64/dl-machine.h
++++ b/sysdeps/powerpc/powerpc64/dl-machine.h
+@@ -79,6 +79,7 @@ elf_host_tolerates_class (const Elf64_Ehdr *ehdr)
+ static inline Elf64_Addr
+ elf_machine_load_address (void) __attribute__ ((const));
+
++#ifndef __PCREL__
+ static inline Elf64_Addr
+ elf_machine_load_address (void)
+ {
+@@ -106,6 +107,24 @@ elf_machine_dynamic (void)
+ /* Then subtract off the load address offset. */
+ return runtime_dynamic - elf_machine_load_address() ;
+ }
++#else /* __PCREL__ */
++/* In PCREL mode, r2 may have been clobbered. Rely on relative
++ relocations instead. */
++
++static inline ElfW(Addr)
++elf_machine_load_address (void)
++{
++ extern const ElfW(Ehdr) __ehdr_start attribute_hidden;
++ return (ElfW(Addr)) &__ehdr_start;
++}
++
++static inline ElfW(Addr)
++elf_machine_dynamic (void)
++{
++ extern ElfW(Dyn) _DYNAMIC[] attribute_hidden;
++ return (ElfW(Addr)) _DYNAMIC - elf_machine_load_address ();
++}
++#endif /* __PCREL__ */
+
+ /* The PLT uses Elf64_Rela relocs. */
+ #define elf_machine_relplt elf_machine_rela
+--
+2.33.0
+