rpath在库中的传播失败

时间:2014-08-13 16:44:20

标签: macos mach-o dyld rpath

简短问题:库中的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.dyliblibplugin.dylib都没有定义rpath命令。并且安装名称没有任何@ rpath /或其他路径,尽管加载命令中的名称前缀为@rpath /.

客户端现在加载libapi.dylib,而libloader.dylib又与libplugin.dylib相关联。此库动态加载libloader.dylib,链接到libplugin.dylib

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

0 个答案:

没有答案