This is the mail archive of the glibc-bugs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]