简短的问题:库中命令的 rpath 是否LC_RPATH传递给后续(和间接)动态加载的库?
更准确地说:我已经libapi.dylib动态链接到libloader.dylib它,而后者又动态加载了一个插件libplugin.dylib。我有:
$ 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)
既不libloader.dylib也不libplugin.dylib定义 rpath 命令。并且安装名称没有任何@rpath/ 或其他路径,尽管加载命令中的名称以@rpath/ 开头。
客户端现在加载libapi.dylib又链接到libloader.dylib. 该库现在动态加载libplugin.dylib链接到libloader.dylib.
为什么不能通过libplugin.dylib加载?它因为找不到而退出libloader.dylib- 尽管它必须已经加载。为什么 rpath @loader_path/ fromlibapi.dylib没有正确传播libloader.dylib到libplugin.dylib?使用 DYLD_PRINT_RPATHS 环境变量,我可以看到,为了加载libloader.dylib. libplugin.dylib这到底是怎么回事?