简短问题:库中的LC_RPATH
命令的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
无法加载?它退出,因为找不到libapi.dylib
- 虽然它必须已经加载。为什么来自libloader.dylib
的rpath @ loader_path /未正确地传播到libplugin.dylib
到libloader.dylib
?使用DYLD_PRINT_RPATHS环境变量,我可以看到,为了在libplugin.dylib
中加载{{1}},没有尝试使用rpath替换。到底发生了什么事?