mirror of
https://github.com/crosstool-ng/crosstool-ng.git
synced 2024-12-21 05:43:09 +00:00
36bb675a71
- GLIBC requires a fix to work with binutils 2.30 on aarch64. This fix relies on binutils 2.24 or newer, which is okay for glibc 2.26 since it needs 2.25 or newer anyway. But older glibc versions are now pinned to binutils 2.29 or older on aarch64. - xtensa needs patches in libgcc with gcc 7.3. - comment in newlib's patch to indicate it is a reversal of a commit. Signed-off-by: Alexey Neyman <stilor@att.net>
76 lines
2.7 KiB
Diff
76 lines
2.7 KiB
Diff
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
|