summaryrefslogtreecommitdiff
path: root/elf/dl-deps.c
diff options
context:
space:
mode:
Diffstat (limited to 'elf/dl-deps.c')
-rw-r--r--elf/dl-deps.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/elf/dl-deps.c b/elf/dl-deps.c
index 9fe974d982..28733ab60d 100644
--- a/elf/dl-deps.c
+++ b/elf/dl-deps.c
@@ -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;