summaryrefslogtreecommitdiff
path: root/packages/glibc/2.26/0001-aarch64-rewrite-elf_machine_load_address.patch
blob: 14c0780bf986dba8f09c6f74fbefe566f26cb053 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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