7

简短的问题:库中命令的 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.dyliblibplugin.dylib?使用 DYLD_PRINT_RPATHS 环境变量,我可以看到,为了加载libloader.dylib. libplugin.dylib这到底是怎么回事?

4

0 回答 0