为什么不再转发我的环境变量?

Cor*_*lks 17 c xcode lldb

我正在为FFmpeg编写补丁,需要调试我的代码.我正在加载一个外部库,为了测试不同的库版本,我将它们放在不同的文件夹中.要选择我想要使用哪一个,我一直在使用DYLD_LIBRARY_PATH=/path/to/lib/dir ./ffmpeg,并且工作正常.但是当我在lldb里面尝试时,它崩溃说dyld: Library not loadedReason: image not found.这曾经在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;
}
Run Code Online (Sandbox Code Playgroud)

按如下方式运行此程序会产生输出:

$ ./a.out
(null)
$ DYLD_LIBRARY_PATH=/tmp ./a.out
/tmp
Run Code Online (Sandbox Code Playgroud)

那看起来还不错.但是当我尝试使用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)
Run Code Online (Sandbox Code Playgroud)

试图在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) 
Run Code Online (Sandbox Code Playgroud)

lldb版本(它来自Xcode 7.1):

$ lldb --version
lldb-340.4.110
Run Code Online (Sandbox Code Playgroud)

问题:这是一个新的"功能",还是lldb中的一个新bug(或者我完全疯了,这从未使用过)?我很乐意lldb用来转发DYLD_LIBRARY_PATH环境变量,那怎么回事呢?


编辑:这是在OS X 10.11.1上.

Ken*_*ses 29

如果这是在El Capitan(OS X 10.11)上,那么它几乎肯定是系统完整性保护的副作用.从" 系统完整性保护指南:运行时保护"一文中:

当进程启动时,内核会检查主要可执行文件是在磁盘上受保护还是使用特殊系统权利进行签名.如果其中任何一个为真,则设置一个标志以表示它受到保护以免被修改....

... 启动受保护的进程时,将清除任何动态的linker(dyld)环境变量,例如DYLD_LIBRARY_PATH.

/ usr/bin中的所有内容都以这种方式受到保护.因此,当您调用/ usr/bin/lldb时,将清除所有DYLD_*环境变量.

它应该可以在Xcode.app或命令行工具中运行lldb,如下所示:

DYLD_LIBRARY_PATH=whatever /Applications/Xcode.app/Contents/Developer/usr/bin/lldb <whatever else>
Run Code Online (Sandbox Code Playgroud)

我不相信lldb的副本受到保护./ usr/bin/lldb实际上只是一个在Xcode或命令行工具中执行版本的蹦床,所以你最终运行同样的东西.但是/ usr/bin/lldb受到保护,因此运行时会清除DYLD_*环境变量.

否则,您必须在Lldb中设置环境变量,如Greg Clayton所示,在您链接的那个线程中.或者,您可以禁用系统完整性保护,尽管它有很好的用途.

  • 谢谢.这也解决了我的问题(在El Capitan上).我创建了一个别名`alias lldb =/Applications/Xcode.app/Contents/Developer/usr/bin/lldb`来减轻输入. (2认同)