Sat Jul 13 20:17:38 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
authorroland <roland>
Sun, 14 Jul 1996 05:27:42 +0000 (05:27 +0000)
committerroland <roland>
Sun, 14 Jul 1996 05:27:42 +0000 (05:27 +0000)
* elf/dl-deps.c (_dl_map_object_deps): Take new args PRELOADS and
NPRELOADS, vector of `struct link_map *'s; add them to the searchlist
between MAP and its deps.
* elf/link.h: Fix decl.
* elf/rtld.c (dl_main): If not secure, parse LD_PRELOAD for
colon-separated list of names, map those and pass vector of ptrs as
PRELOADS list to _dl_map_object_deps.
* elf/dl-runtime.c (_dl_object_relocation_scope): Pass new args to
_dl_map_object_deps with empty preload list.
* elf/dl-open.c (_dl_open): Likewise.

elf/dl-deps.c
elf/dl-open.c
elf/dl-runtime.c
elf/link.h

index 9fe974d..28733ab 100644 (file)
@@ -23,20 +23,29 @@ Cambridge, MA 02139, USA.  */
 #include <stdlib.h>
 
 void
-_dl_map_object_deps (struct link_map *map)
+_dl_map_object_deps (struct link_map *map,
+                    struct link_map **preloads, unsigned int npreloads)
 {
   struct list
     {
       struct link_map *map;
       struct list *next;
     };
-  struct list head, *tailp, *scanp;
+  struct list head[1 + npreloads], *tailp, *scanp;
   unsigned int nlist;
 
   /* Start the search list with one element: MAP itself.  */
-  head.map = map;
-  head.next = NULL;
-  nlist = 1;
+  head[0].map = map;
+
+  /* Add the preloaded items after MAP but before any of its dependencies.  */
+  for (nlist = 0; nlist < npreloads; ++nlist)
+    {
+      head[nlist].next = &head[nlist + 1];
+      head[nlist + 1].map = preloads[nlist];
+    }
+
+  /* Terminate the list.  */
+  head[nlist++].next = NULL;
 
   /* We use `l_reserved' as a mark bit to detect objects we have already
      put in the search list and avoid adding duplicate elements later in
@@ -47,7 +56,7 @@ _dl_map_object_deps (struct link_map *map)
      dependencies and appending them to the list as we step through it.
      This produces a flat, ordered list that represents a breadth-first
      search of the dependency tree.  */
-  for (scanp = tailp = &head; scanp; scanp = scanp->next)
+  for (scanp = tailp = head; scanp; scanp = scanp->next)
     {
       struct link_map *l = scanp->map;
 
@@ -91,7 +100,7 @@ _dl_map_object_deps (struct link_map *map)
   map->l_nsearchlist = nlist;
 
   nlist = 0;
-  for (scanp = &head; scanp; scanp = scanp->next)
+  for (scanp = head; scanp; scanp = scanp->next)
     {
       map->l_searchlist[nlist++] = scanp->map;
 
index c24920f..058c3e5 100644 (file)
@@ -39,7 +39,7 @@ _dl_open (const char *file, int mode)
     return new;
 
   /* Load that object's dependencies.  */
-  _dl_map_object_deps (new);
+  _dl_map_object_deps (new, NULL, 0);
 
 
   /* Relocate the objects loaded.  We do this in reverse order so that copy
index 8ad2c0f..cdacd75 100644 (file)
@@ -41,7 +41,7 @@ _dl_object_relocation_scope (struct link_map *l)
 
       if (! l->l_searchlist)
        /* We must construct the searchlist for this object.  */
-       _dl_map_object_deps (l);
+       _dl_map_object_deps (l, NULL, 0);
 
       /* The primary scope is this object itself and its
         dependencies.  */
index 1e0104a..fa96613 100644 (file)
@@ -196,9 +196,13 @@ extern int _dlerror_run (void (*operate) (void));
 extern struct link_map *_dl_map_object (struct link_map *loader,
                                        const char *name, int type);
 
-/* Call _dl_map_object on the dependencies of MAP, and
-   set up MAP->l_searchlist.  */
-extern void _dl_map_object_deps (struct link_map *map);
+/* Call _dl_map_object on the dependencies of MAP, and set up
+   MAP->l_searchlist.  PRELOADS points to a vector of NPRELOADS previously
+   loaded objects that will be inserted into MAP->l_searchlist after MAP
+   but before its dependencies.  */
+extern void _dl_map_object_deps (struct link_map *map,
+                                struct link_map **preloads,
+                                unsigned int npreloads);
 
 /* Cache the locations of MAP's hash table.  */
 extern void _dl_setup_hash (struct link_map *map);