简短的问题:库中命令的 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
这到底是怎么回事?