我正在为FFmpeg打补丁,需要调试我的代码。我正在加载一个外部库,为了测试不同的库版本,我把它们放在不同的文件夹中。为了选择我想使用的版本,我一直使用DYLD_LIBRARY_PATH=/path/to/lib/dir ./ffmpeg
,它工作正常。但是当我在lldb
中尝试时,它崩溃了,说dyld: Library not loaded
和Reason: 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;
}
按如下方式运行此程序将生成输出:
$ ./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中的一个新bug(或者我完全疯了,这从来没有工作过)?我非常肯定lldb用于转发DYLD_LIBRARY_PATH
环境变量,那么为什么它不再是了?
编辑:这是在OS X 10. 11. 1上。
2条答案
按热度按时间hpxqektj1#
如果这是在El Capitan(OS X 10.11)上,那么几乎可以肯定这是系统完整性保护的副作用。
当一个进程启动时,内核会检查主可执行文件是否在磁盘上受到保护,或者是否有特殊的系统授权签名。如果有一个是真的,则会设置一个标志来表示它受到保护,不能被修改。
...启动受保护进程时,任何动态链接器(
dyld
)环境变量(如DYLD_LIBRARY_PATH
)都会被清除。usr/bin中的所有内容都以这种方式受到保护。因此,当您调用/usr/bin/lldb时,所有DYLD_* 环境变量都将被清除。
从Xcode.app或命令行工具中运行lldb应该可以,如下所示:
我不相信lldb的副本是受保护的。/usr/bin/lldb实际上只是一个在Xcode或命令行工具中执行该版本的蹦床,所以最终运行的是同一个东西。但/usr/bin/lldb是受保护的,所以在运行时DYLD_* 环境变量会被清除。
否则,您必须在lldb中设置环境变量,如下所示in this thread:
或使用短-v选项:
或者,您可以禁用系统完整性保护,尽管它的作用很好。
xxb16uws2#
一旦启动lldb,就可以在其中设置环境变量。
所以
应该可以用。测试了