* sysdeps/i386/dl-machine.h (elf_machine_load_address): Add a dummy
authorRoland McGrath <roland@gnu.org>
Fri, 23 Aug 2002 10:35:03 +0000 (10:35 +0000)
committerRoland McGrath <roland@gnu.org>
Fri, 23 Aug 2002 10:35:03 +0000 (10:35 +0000)
global variable reference in an unused asm parameter, to ensure the
compiler has set up the GOT register before we use it.

ChangeLog
sysdeps/i386/dl-machine.h

index a3d86eb..55e1888 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2002-08-23  Roland McGrath  <roland@redhat.com>
 
+       * sysdeps/i386/dl-machine.h (elf_machine_load_address): Add a dummy
+       global variable reference in an unused asm parameter, to ensure the
+       compiler has set up the GOT register before we use it.
+
        * malloc/hooks.c: Move variable definitions ahead of uses.
        * libio/fileops.c: Move versioned_symbol defns ahead of _IO_jump_t
        initializers that make reference to variables they define.
index 8092e88..09c1a9b 100644 (file)
@@ -49,10 +49,14 @@ elf_machine_dynamic (void)
 static inline Elf32_Addr __attribute__ ((unused))
 elf_machine_load_address (void)
 {
+  /* It doesn't matter what variable this is, the reference never makes
+     it to assembly.  We need a dummy reference to some global variable
+     via the GOT to make sure the compiler initialized %ebx in time.  */
+  extern int _dl_argc;
   Elf32_Addr addr;
   asm ("leal _dl_start@GOTOFF(%%ebx), %0\n"
        "subl _dl_start@GOT(%%ebx), %0"
-       : "=r" (addr) : : "cc");
+       : "=r" (addr) : "m" (_dl_argc) : "cc");
   return addr;
 }