I think there's a bug in the dlopen(3) page. It says that
"If the executable file for the calling program contains a DT_RUN‐
PATH tag, then the directories listed in that tag are searched."
But that's not the case, as demonstrated by this example:
---
echo -e '#include <dlfcn.h>\n#include <stdio.h>\nvoid lib1(void) { if
(dlopen("liblib2.so", RTLD_NOW)) printf("ok\\n"); }' > lib1.c
gcc lib1.c -shared -fPIC -o liblib1.so -ldl
cp liblib1.so liblib2.so
echo "void lib1(void); int main(void) { lib1(); }" > main.c
gcc main.c -o main $PWD/liblib1.so -Wl,-rpath,$PWD -Wl,--enable-new-dtags
./main # does not print 'ok'
---
If, on the other hand, you add the DT_RUNPATH tag to the library that calls
dlopen, it gets used and liblib2.so is found.
This patch (http://sources.redhat.com/ml/libc-hacker/2002-10/msg00048.html)
and the answer (http://sourceware.org/ml/libc-hacker/2002-11/msg00011.html)
indicate that this behavior is expected by the glibc developers and not a bug.
The full search seems to scan these directories, from top to bottom:
Unless loading object has RUNPATH:
RPATH of the loading object,
then the RPATH of its loader (unless it has a RUNPATH), ...,
until the end of the chain, which is either the executable
or an object loaded by dlopen
Unless executable has RUNPATH:
RPATH of the executable
LD_LIBRARY_PATH
RUNPATH of the loading object
ld.so.cache
default dirs
Regards,
Christian Kamm
--
To unsubscribe from this list: send the line "unsubscribe linux-man" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html