From d93e028c6bbd491592313fc77e056f6424ea4668 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Sat, 7 Jul 2012 16:32:27 -0400 Subject: fix dlsym RTLD_NEXT support previously this was being handled the same as a library-specific, dependency-order lookup on the next library in the global chain, which is likely to be utterly meaningless. instead the lookup needs to be in the global namespace, but omitting the initial portion of the global library chain up through the calling library. --- src/ldso/dynlink.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c index 55c2bbe4..263593ab 100644 --- a/src/ldso/dynlink.c +++ b/src/ldso/dynlink.c @@ -766,7 +766,9 @@ static void *do_dlsym(struct dso *p, const char *s, void *ra) if (p == RTLD_NEXT) { for (p=head; p && (unsigned char *)ra-p->map>p->map_len; p=p->next); if (!p) p=head; - p=p->next; + void *res = find_sym(p->next, s, 0); + if (!res) goto failed; + return res; } if (p == head || p == RTLD_DEFAULT) { void *res = find_sym(head, s, 0); -- cgit v1.2.1