diff options
Diffstat (limited to 'packages/glibc/2.26/0001-aarch64-rewrite-elf_machine_load_address.patch')
-rw-r--r-- | packages/glibc/2.26/0001-aarch64-rewrite-elf_machine_load_address.patch | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/packages/glibc/2.26/0001-aarch64-rewrite-elf_machine_load_address.patch b/packages/glibc/2.26/0001-aarch64-rewrite-elf_machine_load_address.patch new file mode 100644 index 00000000..14c0780b --- /dev/null +++ b/packages/glibc/2.26/0001-aarch64-rewrite-elf_machine_load_address.patch @@ -0,0 +1,75 @@ +commit a68ba2f3cd3cbe32c1f31e13c20ed13487727b32 +Author: Szabolcs Nagy <szabolcs.nagy@arm.com> +Date: Wed Oct 18 17:26:23 2017 +0100 + + [AARCH64] Rewrite elf_machine_load_address using _DYNAMIC symbol + + This patch rewrites aarch64 elf_machine_load_address to use special _DYNAMIC + symbol instead of _dl_start. + + The static address of _DYNAMIC symbol is stored in the first GOT entry. + Here is the change which makes this solution work (part of binutils 2.24): + https://sourceware.org/ml/binutils/2013-06/msg00248.html + + i386, x86_64 targets use the same method to do this as well. + + The original implementation relies on a trick that R_AARCH64_ABS32 relocation + being resolved at link time and the static address fits in the 32bits. + However, in LP64, normally, the address is defined to be 64 bit. + + Here is the C version one which should be portable in all cases. + + * sysdeps/aarch64/dl-machine.h (elf_machine_load_address): Use + _DYNAMIC symbol to calculate load address. + +--- + sysdeps/aarch64/dl-machine.h | 37 ++++--------------------------------- + 1 file changed, 4 insertions(+), 33 deletions(-) + +--- a/sysdeps/aarch64/dl-machine.h ++++ b/sysdeps/aarch64/dl-machine.h +@@ -51,40 +51,11 @@ + /* To figure out the load address we use the definition that for any symbol: + dynamic_addr(symbol) = static_addr(symbol) + load_addr + +- The choice of symbol is arbitrary. The static address we obtain +- by constructing a non GOT reference to the symbol, the dynamic +- address of the symbol we compute using adrp/add to compute the +- symbol's address relative to the PC. +- This depends on 32/16bit relocations being resolved at link time +- and that the static address fits in the 32/16 bits. */ ++ _DYNAMIC sysmbol is used here as its link-time address stored in ++ the special unrelocated first GOT entry. */ + +- ElfW(Addr) static_addr; +- ElfW(Addr) dynamic_addr; +- +- asm (" \n" +-" adrp %1, _dl_start; \n" +-#ifdef __LP64__ +-" add %1, %1, #:lo12:_dl_start \n" +-#else +-" add %w1, %w1, #:lo12:_dl_start \n" +-#endif +-" ldr %w0, 1f \n" +-" b 2f \n" +-"1: \n" +-#ifdef __LP64__ +-" .word _dl_start \n" +-#else +-# ifdef __AARCH64EB__ +-" .short 0 \n" +-# endif +-" .short _dl_start \n" +-# ifndef __AARCH64EB__ +-" .short 0 \n" +-# endif +-#endif +-"2: \n" +- : "=r" (static_addr), "=r" (dynamic_addr)); +- return dynamic_addr - static_addr; ++ extern ElfW(Dyn) _DYNAMIC[] attribute_hidden; ++ return (ElfW(Addr)) &_DYNAMIC - elf_machine_dynamic (); + } + + /* Set up the loaded object described by L so its unrelocated PLT |