Short question: Are the rpaths from a LC_RPATH
command inside a library passed onto subsequent (and indirect) dynamically loaded libraries?
To be more precise: I have libapi.dylib
dynamically linked to libloader.dylib
which in turn dynamically loads a plugin libplugin.dylib
. I've got:
$ otool -l lib/libapi.dylib
lib/libapi.dylib
libapi.dylib
/usr/lib/libSystem.B.dylib
@rpath/libloader.dylib
$ otool -l lib/libloader.dylib
lib/libloader.dylib
libloader.dylib
/usr/lib/libSystem.B.dylib
$ otool -l lib/plugins/libplugin.dylib
lib/plugins/libplugin.dylib:
libplugin.dylib
/usr/lib/libSystem.B.dylib
@rpath/libloader.dylib
$ otool -L lib/libapi.dylib | grep "LC_RPATH" -A2
cmd LC_RPATH
cmdsize 32
path @loader_path/ (offset 12)
Neither libloader.dylib
nor libplugin.dylib
define a rpath command. And the install names are without any @rpath/ or other paths, although the names in the load commands are prepended by a @rpath/.
The client now loads libapi.dylib
which in turn is linked to libloader.dylib
. This library dynamically now loads libplugin.dylib
which is linked to libloader.dylib
.
Why can't libplugin.dylib
by loaded? It quits since it can't find libloader.dylib
- although it must be already loaded. Why is the rpath @loader_path/ from libapi.dylib
not properly propagated over libloader.dylib
to libplugin.dylib
? Using the DYLD_PRINT_RPATHS environment variable, I can see, that no rpath substitution is tried in order to load libloader.dylib
in libplugin.dylib
. What the heck going on here?