about summary refs log tree commit diff
path: root/elf
diff options
context:
space:
mode:
Diffstat (limited to 'elf')
-rw-r--r--elf/dl-version.c10
-rw-r--r--elf/link.h6
-rw-r--r--elf/rtld.c2
3 files changed, 12 insertions, 6 deletions
diff --git a/elf/dl-version.c b/elf/dl-version.c
index d06fd5ce1e..0675b1c8ec 100644
--- a/elf/dl-version.c
+++ b/elf/dl-version.c
@@ -53,7 +53,7 @@ extern char **_dl_argv;
 
 
 static inline struct link_map *
-find_needed (const char *name)
+find_needed (const char *name, struct link_map *map)
 {
   unsigned int n;
 
@@ -61,6 +61,12 @@ find_needed (const char *name)
     if (_dl_name_match_p (name, _dl_loaded->l_searchlist[n]))
       return _dl_loaded->l_searchlist[n];
 
+  /* The required object is not in the global scope, look to see if it is
+     a dependency of the current object.  */
+  for (n = 0; n < map->l_nsearchlist; n++)
+    if (_dl_name_match_p (name, map->l_searchlist[n]))
+      return map->l_searchlist[n];
+
   /* Should never happen.  */
   return NULL;
 }
@@ -182,7 +188,7 @@ _dl_check_map_versions (struct link_map *map, int verbose)
       while (1)
 	{
 	  ElfW(Vernaux) *aux;
-	  struct link_map *needed = find_needed (strtab + ent->vn_file);
+	  struct link_map *needed = find_needed (strtab + ent->vn_file, map);
 
 	  /* If NEEDED is NULL this means a dependency was not found
 	     and no stub entry was created.  This should never happen.  */
diff --git a/elf/link.h b/elf/link.h
index 20e80b1466..f457174df5 100644
--- a/elf/link.h
+++ b/elf/link.h
@@ -62,7 +62,7 @@ struct r_debug
 	   the `r_brk' address is called.  */
 	RT_CONSISTENT,		/* Mapping change is complete.  */
 	RT_ADD,			/* Beginning to add a new object.  */
-	RT_DELETE,		/* Beginning to remove an object mapping.  */
+	RT_DELETE		/* Beginning to remove an object mapping.  */
       } r_state;
 
     ElfW(Addr) r_ldbase;	/* Base address the linker is loaded at.  */
@@ -152,7 +152,7 @@ struct link_map
       {
 	lt_executable,		/* The main executable program.  */
 	lt_library,		/* Library needed by main executable.  */
-	lt_loaded,		/* Extra run-time loaded shared object.  */
+	lt_loaded		/* Extra run-time loaded shared object.  */
       } l_type:2;
     unsigned int l_relocated:1;	/* Nonzero if object's relocations done.  */
     unsigned int l_init_called:1; /* Nonzero if DT_INIT function called.  */
@@ -167,7 +167,7 @@ struct link_map
 
 
 /* Test whether given NAME matches any of the names of the given object.  */
-static inline int
+static __inline int
 __attribute__ ((unused))
 _dl_name_match_p (const char *__name, struct link_map *__map)
 {
diff --git a/elf/rtld.c b/elf/rtld.c
index 78ca490447..22c1059fd2 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -358,7 +358,7 @@ of this helper program; chances are you did not intend to run this program.\n",
 	 This will be what dlopen on "" returns.  */
       main_map = _dl_new_object ((char *) "", "", lt_executable);
       if (main_map == NULL)
-	_dl_sysdep_fatal ("cannot allocate memory for link map", NULL);
+	_dl_sysdep_fatal ("cannot allocate memory for link map\n", NULL);
       main_map->l_phdr = phdr;
       main_map->l_phnum = phent;
       main_map->l_entry = *user_entry;