RTLD_NEXT support
authorRich Felker <dalias@aerifal.cx>
Tue, 16 Aug 2011 04:42:13 +0000 (00:42 -0400)
committerRich Felker <dalias@aerifal.cx>
Tue, 16 Aug 2011 04:42:13 +0000 (00:42 -0400)
the asm wrapper is needed to get the return address without
compiler-specific extensions.

src/ldso/dlsym.c [new file with mode: 0644]
src/ldso/dynlink.c
src/ldso/i386/dlsym.s [new file with mode: 0644]
src/ldso/x86_64/dlsym.s [new file with mode: 0644]

diff --git a/src/ldso/dlsym.c b/src/ldso/dlsym.c
new file mode 100644 (file)
index 0000000..3369314
--- /dev/null
@@ -0,0 +1,8 @@
+#include <dlfcn.h>
+
+void *__dlsym(void *, const char *, void *);
+
+void *dlsym(void *p, const char *s)
+{
+       return __dlsym(p, s, 0);
+}
index ced1637..3fafb18 100644 (file)
@@ -638,11 +638,16 @@ end:
        return p;
 }
 
-static void *do_dlsym(struct dso *p, const char *s)
+static void *do_dlsym(struct dso *p, const char *s, void *ra)
 {
        size_t i;
        uint32_t h;
        Sym *sym;
+       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;
+       }
        if (p == head || p == RTLD_DEFAULT)
                return find_sym(head, s, 0);
        h = hash(s);
@@ -658,11 +663,11 @@ static void *do_dlsym(struct dso *p, const char *s)
        return 0;
 }
 
-void *dlsym(void *p, const char *s)
+void *__dlsym(void *p, const char *s, void *ra)
 {
        void *res;
        pthread_rwlock_rdlock(&lock);
-       res = do_dlsym(p, s);
+       res = do_dlsym(p, s, ra);
        pthread_rwlock_unlock(&lock);
        return res;
 }
diff --git a/src/ldso/i386/dlsym.s b/src/ldso/i386/dlsym.s
new file mode 100644 (file)
index 0000000..abd53a0
--- /dev/null
@@ -0,0 +1,10 @@
+.text
+.global dlsym
+.type dlsym,@function
+dlsym:
+       push (%esp)
+       push 12(%esp)
+       push 12(%esp)
+       call __dlsym
+       add $12,%esp
+       ret
diff --git a/src/ldso/x86_64/dlsym.s b/src/ldso/x86_64/dlsym.s
new file mode 100644 (file)
index 0000000..4261145
--- /dev/null
@@ -0,0 +1,6 @@
+.text
+.global dlsym
+.type dlsym,@function
+dlsym:
+       mov (%rsp),%edx
+       jmp __dlsym