This is the mail archive of the
glibc-bugs@sourceware.org
mailing list for the glibc project.
Re: dlopen(RTLD_NOW|RTLD_GLOBAL) / dlsym(RTLD_NEXT) question
- From: Yann LANGLAIS <langlais at ilay dot org>
- To: glibc-bugs at sources dot redhat dot com
- Date: Thu, 18 Aug 2005 22:21:29 +0200
- Subject: Re: dlopen(RTLD_NOW|RTLD_GLOBAL) / dlsym(RTLD_NEXT) question
I've made significant progress since my last mail.
It seems that dlsym(RTLD_NEXT, "foo") does not work when the libraries
are loaded during runtime :
cat > chain5.c <<EOF
#include <dlfcn.h>
int main() {
void *l1, *l2, *l3, *l4;
void (*bar)();
l1 = dlopen("lib1.so", RTLD_NOW | RTLD_GLOBAL);
bar = (void (*)()) dlsym(l1, "foo");
printf("l1 is %x l1.foo is %x\n", l1, bar);
l2 = dlopen("lib2.so", RTLD_NOW | RTLD_GLOBAL);
bar = (void (*)()) dlsym(l2, "foo");
printf("l2 is %x l2.foo is %x\n", l2, bar);
l3 = dlopen("lib3.so", RTLD_NOW | RTLD_GLOBAL);
bar = (void (*)()) dlsym(l3, "foo");
printf("l3 is %x l3.foo is %x\n", l3, bar);
l4 = dlopen("lib4.so", RTLD_NOW | RTLD_GLOBAL);
bar = (void (*)()) dlsym(l4, "foo");
printf("l4 is %x l4.foo is %x\n", l4, bar);
bar = (void (*)()) dlsym(l1, "foo");
printf("l1.foo is %x \n", bar);
bar = (void (*)()) dlsym(l2, "foo");
printf("l2.foo is %x \n", bar);
bar = (void (*)()) dlsym(l3, "foo");
printf("l3.foo is %x \n", bar);
bar = (void (*)()) dlsym(l4, "foo");
printf("l4.foo is %x \n", bar);
bar = (void (*)()) dlsym(RTLD_DEFAULT, "foo");
printf("default foo is %x \n", bar);
bar();
dlclose(l4);
dlclose(l3);
dlclose(l2);
dlclose(l1);
return 0;
}
EOF
gcc chain5.c -o chain5 -ldl -D_GNU_SOURCE
chain5
l1 is 804a018 l1.foo is 5556d584
l2 is 804a3b0 l2.foo is 55570584
l3 is 804a710 l3.foo is 55572584
l4 is 804aa70 l4.foo is 55574584
l1.foo is 5556d584
l2.foo is 55570584
l3.foo is 55572584
l4.foo is 55574584
default foo is 5556d584
lib1.foo()
Shall I consider it as a feature or as a bug ?
regards,
Yann LANGLAIS
18, avenue Nationale
91300 MASSY
06 67 11 07 10
langlais@ilay.org
http://ilay.org
---
I r i s
L i l a
é A n g e l a
o Y a n n
. O R G