加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 20:05:01 所属栏目:百科 来源:网络整理
导读:我正在为FFmpeg打补丁,需要调试我的代码.我正在加载一个外部库,为了测试不同的库版本,我把它们放在不同的文件夹中.要选择我想要使用哪一个,我一直在使用DYLD_LIBRARY_PATH = / path / to / lib / dir ./ffmpeg,这样可以正常工作.但是当我尝试在lldb,它崩溃说
我正在为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文章:

When a process is started,the kernel checks to see whether the main
executable is protected on disk or is signed with an special system
entitlement. If either is true,then a flag is set to denote that it
is protected against modification. …

… Any dynamic linker (dyld)
environment variables,such as DYLD_LIBRARY_PATH,are purged when
launching protected processes.

/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所示,您链接的线程中.或者,您可以禁用系统完整性保护,尽管它具有很好的用途.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读