This is the mail archive of the
glibc-bugs@sourceware.org
mailing list for the glibc project.
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 14:15:41 +0200 (CEST)
- Subject: dlopen(RTLD_NOW|RTLD_GLOBAL) / dlsym(RTLD_NEXT) question
Hi.
I'm writing an article (in french) about libdl.so and faced a behavior I wasn't
expected while trying to chain functions w/ same name in different libraries with
dlsym/RTLD_NEXT :
Here is a compile time link of the chain components :
for i in 1 2 3 4
do
cat > lib$i.c <<EOF
#include <stdio.h>
#include <dlfcn.h>
void foo() {
void (*next_foo)(void);
printf("lib$i.foo()\n");
if (next_foo = (void (*)(void)) dlsym(RTLD_NEXT, "foo")) next_foo();
}
EOF
gcc -shared -fPIC lib$i.c -o lib$i.so -D_GNU_SOURCE
done
cat > chain.c <<EOF
#include <dlfcn.h>
extern void foo();
int main() {
foo();
return 0;
}
EOF
gcc chain.c -o chain -L. -l1 -l2 -l3 -l4 -ldl
LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./chain
And the result :
lib1.foo()
lib2.foo()
lib3.foo()
lib4.foo()
And now a runtime linking version:
cat > chain2.c <<EOF
#include <dlfcn.h>
int main() {
void *l1, *l2, *l3, *l4;
void (*bar)();
l1 = dlopen("lib1.so", RTLD_NOW | RTLD_GLOBAL);
l2 = dlopen("lib2.so", RTLD_NOW | RTLD_GLOBAL);
l3 = dlopen("lib3.so", RTLD_NOW | RTLD_GLOBAL);
l4 = dlopen("lib4.so", RTLD_NOW | RTLD_GLOBAL);
bar = (void (*)()) dlsym(RTLD_DEFAULT, "foo");
bar();
dlclose(l4);
dlclose(l3);
dlclose(l2);
dlclose(l1);
return 0;
}
EOF
gcc chain2.c -o chain2 -ldl -D_GNU_SOURCE
LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./chain2
And the result :
lib1.foo()
Period. Other functions in other libs are ignored.
Is this behavior normal ?
Regards,
Yann LANGLAIS
http://ilay.org
langlais@ilay.org
--
I r i s
L i l a
é A n g e l a
o Y a n n
. o r g