* sysdeps/arm/dl-machine.h (elf_machine_dynamic): Rewrite to load
authorDaniel Jacobowitz <dan@codesourcery.com>
Tue, 30 May 2006 15:18:49 +0000 (15:18 +0000)
committerDaniel Jacobowitz <dan@codesourcery.com>
Tue, 30 May 2006 15:18:49 +0000 (15:18 +0000)
_GLOBAL_OFFSET_TABLE_ explicitly.

ChangeLog.arm
sysdeps/arm/dl-machine.h

index 097491f..a80313d 100644 (file)
@@ -1,5 +1,10 @@
 2006-05-30  Daniel Jacobowitz  <dan@codesourcery.com>
 
+       * sysdeps/arm/dl-machine.h (elf_machine_dynamic): Rewrite to load
+       _GLOBAL_OFFSET_TABLE_ explicitly.
+
+2006-05-30  Daniel Jacobowitz  <dan@codesourcery.com>
+
        * sysdeps/unix/sysv/linux/arm/kernel-features.h: Add conditionals
        for __ASSUME_TRUNCATE64_SYSCALL, __ASSUME_MMAP2_SYSCALL,
        __ASSUME_STAT64_SYSCALL, __ASSUME_FCNTL64, and
index f176ff1..5347d8b 100644 (file)
@@ -46,13 +46,19 @@ elf_machine_matches_host (const Elf32_Ehdr *ehdr)
 
 
 /* Return the link-time address of _DYNAMIC.  Conveniently, this is the
-   first element of the GOT.  This must be inlined in a function which
-   uses global data.  */
+   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.  */
 static inline Elf32_Addr __attribute__ ((unused))
 elf_machine_dynamic (void)
 {
-  register Elf32_Addr *got asm ("r10");
-  return *got;
+  Elf32_Addr dynamic;
+  asm ("ldr %0, 2f\n"
+       "1: add %0, pc, %0\n"
+       "b 3f\n"
+       "2: .word _GLOBAL_OFFSET_TABLE_ - (1b+8)\n"
+       "3:" : "=r" (dynamic));
+  return dynamic;
 }