about summary refs log tree commit diff
path: root/elf
diff options
context:
space:
mode:
Diffstat (limited to 'elf')
-rw-r--r--elf/dl-open.c9
-rw-r--r--elf/genrtldtbl.awk2
-rw-r--r--elf/rtld.c8
3 files changed, 13 insertions, 6 deletions
diff --git a/elf/dl-open.c b/elf/dl-open.c
index 84a76cfb4a..b984aa8f89 100644
--- a/elf/dl-open.c
+++ b/elf/dl-open.c
@@ -1,5 +1,5 @@
 /* Load a shared object at runtime, relocate it, and run its initializer.
-   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -93,6 +93,13 @@ _dl_open (const char *file, int mode)
 	     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;
+
+	  /* GCC is very clever.  If we wouldn't add some magic it would
+	     simply optimize away our nice little variable `reloc' and we
+	     would result in a not working binary.  So let's swing the
+	     magic ward.  */
+	  asm ("" : "=r" (reloc) : "0" (reloc));
+
 	  (*reloc) (l, _dl_object_relocation_scope (l),
 		    (mode & RTLD_BINDING_MASK) == RTLD_LAZY);
 	  *_dl_global_scope_end = NULL;
diff --git a/elf/genrtldtbl.awk b/elf/genrtldtbl.awk
index f5656a2b44..63ada003f6 100644
--- a/elf/genrtldtbl.awk
+++ b/elf/genrtldtbl.awk
@@ -12,7 +12,7 @@ BEGIN {
 END {
   for (i = 0; i < count; ++i) {
     printf ("static struct r_search_path_elem rtld_search_dir%d =\n", i+1);
-    printf ("  { \"%s/\", %d, unknown, 0, unknown, ",
+    printf ("  { \"%s/\", %d, unknown, 0, nonexisting, ",
 	    dir[i], length (dir[i]) + 1);
     if (i== 0)
       printf ("NULL };\n");
diff --git a/elf/rtld.c b/elf/rtld.c
index e0d35216b6..aa40d42097 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -482,6 +482,10 @@ of this helper program; chances are you did not intend to run this program.\n",
   preloads = NULL;
   npreloads = 0;
 
+  /* Initialize the data structures for the search paths for shared
+     objects.  */
+  _dl_init_paths ();
+
   preloadlist = getenv ("LD_PRELOAD");
   if (preloadlist)
     {
@@ -595,10 +599,6 @@ of this helper program; chances are you did not intend to run this program.\n",
       assert (i == npreloads);
     }
 
-  /* Initialize the data structures for the search paths for shared
-     objects.  */
-  _dl_init_paths ();
-
   /* Load all the libraries specified by DT_NEEDED entries.  If LD_PRELOAD
      specified some libraries to load, these are inserted before the actual
      dependencies in the executable's searchlist for symbol resolution.  */