为什么 DYLD_LIBRARY_PATH 没有在这里传播?

2023-12-21

我有一个简单的 C++ 程序,我试图运行该程序,该程序与我之前构建的 Boost.Thread 库的版本链接。我似乎无法理解运行时库路径在 OS X 上的行为方式。

由于我的 Boost 库没有RPATH 相对安装名称 https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/RunpathDependentLibraries.html,我正在使用DYLD_LIBRARY_PATH环境变量告诉动态链接器在哪里找到libboost_thread.dylib在运行时。

如果我直接在我的(bash) shell:

[~/git/project]$ echo $DYLD_LIBRARY_PATH
/Users/jasonr/git/project/boost/lib
[~/git/project]$ .sconf_temp/conftest_7
[~/git/project]$ # Program runs successfully; this is what I expect.

然而,该程序是作为一系列测试的一部分运行的autoconf-类似我正在使用的框架。它使用以下命令在子 shell 中运行程序sh -c。如果我尝试这样做,会发生以下情况:

[~/git/project]$ # Make sure the environment variable is exported to child shells.
[~/git/project]$ export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH
[~/git/project]$ # Try to run it in a child shell.
[~/git/project]$ sh -c .sconf_temp/conftest_7
dyld: Library not loaded: libboost_thread.dylib
  Referenced from: /Users/jasonr/git/project/.sconf_temp/conftest_7
  Reason: image not found
Trace/BPT trap: 5

就好像环境变量没有传播到dyld在这种情况下。为什么会出现这种情况呢?我更熟悉LD_LIBRARY_PATH在 Linux 上,(我认为)应该适用于上面的示例。为了使这项工作成功,我还需要做其他事情吗?


据推测,您正在运行 El Capitan (OS X 10.11) 或更高版本。这是系统完整性保护的副作用。来自系统完整性保护指南:运行时保护 https://developer.apple.com/library/prerelease/mac/documentation/Security/Conceptual/System_Integrity_Protection_Guide/RuntimeProtections/RuntimeProtections.html文章:

当一个进程启动时,内核会检查主进程是否 可执行文件在磁盘上受保护或使用特殊系统签名 权利。如果任一为真,则设置一个标志来表示它 受到保护以防止修改。 ……

…任何动态链接器(dyld) 环境变量,例如DYLD_LIBRARY_PATH,被清除时 启动受保护的进程。

所有系统提供的口译员,包括/bin/sh,以这种方式受到保护。因此,当您调用sh,所有 DYLD_* 环境变量都被清除。

您可以编写一个 shell 脚本来设置DYLD_LIBRARY_PATH然后执行.sconf_temp/conftest_7。您可以使用 shell 解释器来执行它(实际上,您必须这样做)并且环境变量会很好,因为清除是在启动受保护的可执行文件时发生的。基本上,这种方法类似于您问题中的工作示例,但封装在 shell 脚本中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 DYLD_LIBRARY_PATH 没有在这里传播? 的相关文章

随机推荐