c – 为什么不再转发我的环境变量了?
我正在为FFmpeg打补丁,需要调试我的代码.我正在加载一个外部库,为了测试不同的库版本,我把它们放在不同的文件夹中.要选择我想要使用哪一个,我一直在使用DYLD_LIBRARY_PATH = / path / to / lib / dir ./ffmpeg,这样可以正常工作.但是当我尝试在lldb,它崩溃说dyld:库没有加载和原因:图像没有找到.这个以前用于工作的
Xcode 7.1,但我刚刚升级,它停止工作.
这是我的MVCE: #include <stdio.h> #include <stdlib.h> int main() { char* str = getenv("DYLD_LIBRARY_PATH"); if (str) puts(str); else puts("(null)"); return 0; } 如下运行此程序产生输出: $./a.out (null) $DYLD_LIBRARY_PATH=/tmp ./a.out /tmp 看起来不错但是当我尝试使用lldb它失败: $DYLD_LIBRARY_PATH=/tmp lldb ./a.out (lldb) target create "./a.out" Current executable set to './a.out' (x86_64). (lldb) run Process 54255 launched: './a.out' (x86_64) (null) Process 54255 exited with status = 0 (0x00000000) 尝试在lldb工程中设置环境变量: lldb ./a.out (lldb) target create "./a.out" Current executable set to './a.out' (x86_64). (lldb) env DYLD_LIBRARY_PATH=/tmp (lldb) run Process 54331 launched: './a.out' (x86_64) /tmp Process 54331 exited with status = 0 (0x00000000) lldb版本(来自Xcode 7.1): $lldb --version lldb-340.4.110 问题:这是一个新的“特征”,还是这个lldb中的一个新错误(或者我完全疯狂,这从来没有用过)?我很正面的lldb用来转发DYLD_LIBRARY_PATH环境变量,那么怎么来不了呢? 编辑:这是在OS X 10.11.1. 解决方法
如果这是在El Capitan(OS X 10.11)上,那么这几乎肯定是系统完整性保护的副作用.从
System Integrity Protection Guide: Runtime Protections文章:
/usr/bin中的所有内容都以这种方式进行保护.因此,当您调用/usr/bin/lldb时,将清除所有DYLD_ *环境变量. 它应该可以从Xcode.app或命令行工具中运行lldb,如下所示: DYLD_LIBRARY_PATH=whatever /Applications/Xcode.app/Contents/Developer/usr/bin/lldb <whatever else> 我不相信lldb的副本是受保护的. /usr/bin/lldb实际上只是一个蹦床来执行Xcode或命令行工具中的版本,所以你最终运行的是同样的事情.但是/usr/bin/lldb被保护,所以DYLD_ *环境变量在运行时被清除. 否则,您将必须在lldb内设置环境变量,如Greg Clayton所示,您链接的线程中.或者,您可以禁用系统完整性保护,尽管它具有很好的用途. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |