@@ -54,19 +54,33 @@ elf_machine_load_address (void)
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. */
+ This depends on 32/16bit relocations being resolved at link time
+ and that the static address fits in the 32/16 bits. */
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;