fix dlsym RTLD_NEXT support
authorRich Felker <dalias@aerifal.cx>
Sat, 7 Jul 2012 20:32:27 +0000 (16:32 -0400)
committerRich Felker <dalias@aerifal.cx>
Sat, 7 Jul 2012 20:32:27 +0000 (16:32 -0400)
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

index 55c2bbe..263593a 100644 (file)
@@ -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);