Sat Jun 15 18:13:43 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
authorroland <roland>
Sun, 16 Jun 1996 01:27:32 +0000 (01:27 +0000)
committerroland <roland>
Sun, 16 Jun 1996 01:27:32 +0000 (01:27 +0000)
* elf/dl-open.c (_dl_open): Remove PARENT argument, pass null.
* elf/link.h: Update prototype.
* elf/dl-load.c (_dl_map_object): If dependents' DT_RPATHs don't find
NAME, try the DT_RPATH of the executable itself if dynamic.
* elf/dlopen.c (dlopen): Don't pass first arg to _dl_open.

elf/dl-load.c
elf/dl-open.c
elf/dlopen.c
elf/link.h

index 607477f..f947bb8 100644 (file)
@@ -469,13 +469,24 @@ _dl_map_object (struct link_map *loader, const char *name, int type)
        }
 
       fd = -1;
+
+      /* First try the DT_RPATH of the dependent object that caused NAME
+        to be loaded.  Then that object's dependent, and on up.  */
       for (l = loader; fd == -1 && l; l = l->l_loader)
        if (l && l->l_info[DT_RPATH])
          trypath ((const char *) (l->l_addr +
                                   l->l_info[DT_STRTAB]->d_un.d_ptr +
                                   l->l_info[DT_RPATH]->d_un.d_val));
+      /* If dynamically linked, try the DT_RPATH of the executable itself.  */
+      l = _dl_loaded;
+      if (fd == -1 && l && l->l_type != lt_loaded)
+       trypath ((const char *) (l->l_addr +
+                                l->l_info[DT_STRTAB]->d_un.d_ptr +
+                                l->l_info[DT_RPATH]->d_un.d_val));
+      /* Try an environment variable (unless setuid).  */
       if (fd == -1 && ! _dl_secure)
        trypath (getenv ("LD_LIBRARY_PATH"));
+      /* Finally, try the default path.  */
       if (fd == -1)
        {
          extern const char *_dl_rpath; /* Set in rtld.c. */
index 8171837..c24920f 100644 (file)
@@ -25,22 +25,15 @@ Cambridge, MA 02139, USA.  */
 size_t _dl_global_scope_alloc;
 
 struct link_map *
-_dl_open (struct link_map *parent, const char *file, int mode)
+_dl_open (const char *file, int mode)
 {
   struct link_map *new, *l;
   ElfW(Addr) init;
   struct r_debug *r;
 
 
-#ifdef PIC
-  if (! parent)
-    /* If no particular dependent object caused this load,
-       then use the DT_RPATH of the executable itself.  */
-      parent = _dl_loaded;
-#endif
-
   /* Load the named object.  */
-  new = _dl_map_object (parent, file, lt_loaded);
+  new = _dl_map_object (NULL, file, lt_loaded);
   if (new->l_searchlist)
     /* It was already open.  */
     return new;
index e261fca..9de787d 100644 (file)
@@ -28,7 +28,7 @@ dlopen (const char *file, int mode)
 
   void doit (void)
     {
-      new = _dl_open (_dl_loaded, file ?: "", mode);
+      new = _dl_open (file ?: "", mode);
     }
 
   return _dlerror_run (doit) ? NULL : new;
index f43ec41..1e0104a 100644 (file)
@@ -205,11 +205,9 @@ extern void _dl_setup_hash (struct link_map *map);
 
 
 /* Open the shared object NAME, relocate it, and run its initializer if it
-   hasn't already been run.  LOADER's DT_RPATH is used in searching for
-   NAME.  MODE is as for `dlopen' (see <dlfcn.h>).  If the object is
-   already opened, returns its existing map.  */
-extern struct link_map *_dl_open (struct link_map *loader,
-                                 const char *name, int mode);
+   hasn't already been run.  MODE is as for `dlopen' (see <dlfcn.h>).  If
+   the object is already opened, returns its existing map.  */
+extern struct link_map *_dl_open (const char *name, int mode);
 
 /* Close an object previously opened by _dl_open.  */
 extern void _dl_close (struct link_map *map);