mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-09 10:43:19 -05:00
16b0a936e1
Support for riscv64 in glibc landed in 2.27 so it's unavoidable that we use 2.27. Running a Bitcoin build with toolchains based on 2.24 for platforms other than riscv64 seem to produce binaries which do not have 2.17 symbols. So use 2.24 since it's more recent and maintained by Debian Stretch.
60 lines
2.4 KiB
Diff
60 lines
2.4 KiB
Diff
commit 6b02af31e9a721bb15a11380cd22d53b621711f8
|
|
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.
|
|
|
|
diff --git a/sysdeps/aarch64/dl-machine.h b/sysdeps/aarch64/dl-machine.h
|
|
index e86d8b5b63..5a5b8a5de5 100644
|
|
--- a/sysdeps/aarch64/dl-machine.h
|
|
+++ b/sysdeps/aarch64/dl-machine.h
|
|
@@ -49,26 +49,11 @@ elf_machine_load_address (void)
|
|
/* 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 32bit relocations being resolved at link time
|
|
- and that the static address fits in the 32bits. */
|
|
-
|
|
- ElfW(Addr) static_addr;
|
|
- ElfW(Addr) dynamic_addr;
|
|
-
|
|
- asm (" \n"
|
|
-" adrp %1, _dl_start; \n"
|
|
-" add %1, %1, #:lo12:_dl_start \n"
|
|
-" ldr %w0, 1f \n"
|
|
-" b 2f \n"
|
|
-"1: \n"
|
|
-" .word _dl_start \n"
|
|
-"2: \n"
|
|
- : "=r" (static_addr), "=r" (dynamic_addr));
|
|
- return dynamic_addr - static_addr;
|
|
+ _DYNAMIC sysmbol is used here as its link-time address stored in
|
|
+ the special unrelocated first GOT entry. */
|
|
+
|
|
+ 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
|