diff --git a/sysdeps/aarch64/dl-machine.h b/sysdeps/aarch64/dl-machine.h index 217e179..b2f6618 100644 --- a/sysdeps/aarch64/dl-machine.h +++ b/sysdeps/aarch64/dl-machine.h @@ -49,25 +49,19 @@ 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; + _DYNAMIC symbol is used here as its static address is stored in + the special unrelocated first GOT entry. */ + ElfW(Addr) static_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)); + "adr %0, _DYNAMIC \n" +#ifdef __LP64__ + "ldr %1, _GLOBAL_OFFSET_TABLE_ \n" +#else + "ldr %w1, _GLOBAL_OFFSET_TABLE_ \n" +#endif + : "=r" (dynamic_addr), "=r" (static_addr)); + return dynamic_addr - static_addr; }