From 1a0fc08754ad83ae0a755f8c1bd8d0346494daba Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Tue, 7 May 2013 10:29:13 -0700 Subject: ARM: Rewrite elf_machine_dynamic in pure C. --- ports/ChangeLog.arm | 5 +++++ ports/sysdeps/arm/dl-machine.h | 25 ++++--------------------- 2 files changed, 9 insertions(+), 21 deletions(-) (limited to 'ports') diff --git a/ports/ChangeLog.arm b/ports/ChangeLog.arm index 25981d7..3f504e4 100644 --- a/ports/ChangeLog.arm +++ b/ports/ChangeLog.arm @@ -1,3 +1,8 @@ +2013-05-07 Roland McGrath + + * sysdeps/arm/dl-machine.h (elf_machine_dynamic): Use a plain C + reference to _GLOBAL_OFFSET_TABLE_ with an STV_HIDDEN declaration. + 2013-05-06 Roland McGrath * sysdeps/arm/dl-tlsdesc.S (_dl_tlsdesc_dynamic): Add missing sfi_breg. diff --git a/ports/sysdeps/arm/dl-machine.h b/ports/sysdeps/arm/dl-machine.h index 5a424f8..6e09aa1 100644 --- a/ports/sysdeps/arm/dl-machine.h +++ b/ports/sysdeps/arm/dl-machine.h @@ -39,30 +39,13 @@ elf_machine_matches_host (const Elf32_Ehdr *ehdr) /* Return the link-time address of _DYNAMIC. Conveniently, this is the - first element of the GOT. We used to use the PIC register to do this - without a constant pool reference, but GCC 4.2 will use a pseudo-register - for the PIC base, so it may not be in r10. */ + first element of the GOT. */ static inline Elf32_Addr __attribute__ ((unused)) elf_machine_dynamic (void) { - Elf32_Addr dynamic; -#ifdef __thumb2__ - long tmp; - asm ("ldr\t%0, 1f\n\t" - "adr\t%1, 1f\n\t" - "ldr\t%0, [%0, %1]\n\t" - "b 2f\n" - ".align 2\n" - "1: .word _GLOBAL_OFFSET_TABLE_ - 1b\n" - "2:" : "=r" (dynamic), "=r"(tmp)); -#else - asm ("ldr %0, 2f\n" - "1: ldr %0, [pc, %0]\n" - "b 3f\n" - "2: .word _GLOBAL_OFFSET_TABLE_ - (1b+8)\n" - "3:" : "=r" (dynamic)); -#endif - return dynamic; + /* Declaring this hidden ensures that a PC-relative reference is used. */ + extern const Elf32_Addr _GLOBAL_OFFSET_TABLE_[] attribute_hidden; + return _GLOBAL_OFFSET_TABLE_[0]; } -- cgit v1.1