Sun Jul 14 01:51:39 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
authorroland <roland>
Sun, 14 Jul 1996 09:31:59 +0000 (09:31 +0000)
committerroland <roland>
Sun, 14 Jul 1996 09:31:59 +0000 (09:31 +0000)
* elf/dl-open.c (_dl_open): Force an indirect call for
_dl_relocate_object so there is no chance a PLT fixup will be done
and clobber _dl_global_scope before our call happens.

elf/dl-open.c

index 058c3e5..021c4be 100644 (file)
@@ -52,8 +52,16 @@ _dl_open (const char *file, int mode)
     {
       if (! l->l_relocated)
        {
-         _dl_relocate_object (l, _dl_object_relocation_scope (l),
-                              (mode & RTLD_BINDING_MASK) == RTLD_LAZY);
+         /* We use an indirect call call for _dl_relocate_object because
+            we must avoid using the PLT in the call.  If our PLT entry for
+            _dl_relocate_object hasn't been used yet, then the dynamic
+            linker fixup routine will clobber _dl_global_scope during its
+            work.  We must be sure that nothing will require a PLT fixup
+            between when _dl_object_relocation_scope returns and when we
+            enter the dynamic linker's code (_dl_relocate_object).  */
+         __typeof (_dl_relocate_object) *reloc = &_dl_relocate_object;
+         (*reloc) (l, _dl_object_relocation_scope (l),
+                   (mode & RTLD_BINDING_MASK) == RTLD_LAZY);
          *_dl_global_scope_end = NULL;
        }