Fixed support for RTLD_NEXT in dlsym()
The previous implementation of this flag was broken--it behaved identically
to RTLD_DEFAULT. This adds a proper implementation, which examines the address
of the calling function, and uses it to determine which library to use to begin
the symbol search process.
Change-Id: I2ad2b46363f68932af63a3828a22f9c7987eea67
diff --git a/linker/linker.c b/linker/linker.c
index 87fb19b..451e96c 100644
--- a/linker/linker.c
+++ b/linker/linker.c
@@ -512,13 +512,17 @@
/* This is used by dl_sym(). It performs a global symbol lookup.
*/
-Elf32_Sym *lookup(const char *name, soinfo **found)
+Elf32_Sym *lookup(const char *name, soinfo **found, soinfo *start)
{
unsigned elf_hash = 0;
Elf32_Sym *s = NULL;
soinfo *si;
- for(si = solist; (s == NULL) && (si != NULL); si = si->next)
+ if(start == NULL) {
+ start = solist;
+ }
+
+ for(si = start; (s == NULL) && (si != NULL); si = si->next)
{
if(si->flags & FLAG_ERROR)
continue;