启用SIP后RPATH配置失效,加载MATLAB Runtime库失败求助
关于SIP启用后@rpath配置失败的问题
我的理解确认
- SIP启用时
DYLD_LIBRARY_PATH会被忽略,因此改用@rpath方案 - 可给二进制添加多个
@rpath条目,系统会按顺序尝试查找库文件 - RPATH会从加载器传播到其加载的库及库的依赖项
以上理解是否正确?
当前遇到的问题
辅助二进制grasp需要访问Bundle外部的MATLAB Runtime库,所有RPATH配置尝试均失败,具体信息如下:
SIP未启用时的可行环境变量
DYLD_LIBRARY_PATH="." DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:/Applications/MATLAB/MATLAB_Runtime/v911/runtime/maci64" DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:/Applications/MATLAB/MATLAB_Runtime/v911/bin/maci64" DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:/Applications/MATLAB/MATLAB_Runtime/v911/sys/os/maci64"
添加RPATH的命令
install_name_tool -add_rpath <absolute path> grasp
otool检查结果
查看依赖关系:
otool -L grasp.app/Contents/MacOS/grasp @rpath/libmwlaunchermain.dylib (compatibility version 0.0.0, current version 0.0.0)
查看RPATH条目:
otool -l grasp.app/Contents/MacOS/grasp | grep -B 1 -A 2 LC_RPATH Load command 19 cmd LC_RPATH cmdsize 32 path @loader_path (offset 12) <-- 原始二进制自带 -- -- Load command 20 cmd LC_RPATH cmdsize 32 path @loader_path/\. (offset 12) <-- 原始二进制自带 -- -- Load command 24 cmd LC_RPATH cmdsize 64 path /Applications/MATLAB/MATLAB_Runtime/v911/bin/maci64 (offset 12)
运行时错误
dyld: Library not loaded: @rpath/libmwlaunchermain.dylib Referenced from: grasp.app/Contents/MacOS/grasp Reason: image not found
疑问与求助
我原本预期@rpath/libmwlaunchermain.dylib会被解析为/Applications/MATLAB/MATLAB_Runtime/v911/bin/maci64/libmwlaunchermain.dylib,但实际加载失败。是否因为grasp是辅助二进制导致的?该如何调试这个问题?
Bundle结构
Grasp4Mac.app Contents MacOS/mylauncher <-- 负责启动grasp.app Resources Grasp/graps.app <-- 内嵌Bundle Contents MacOS applauncher <-- 主程序 prelaunch grasp <-- 调用外部库的辅助二进制
内容的提问来源于stack exchange,提问作者linus
相关产品推荐
相关产品推荐

