El Capitan,进行检查,DYLD_LIBRARY_PATH


9

我使用通常的Unix工具集开发应用程序:编译器make,和共享库。传统上,该过程类似于

  • ./configure,可以针对运行机器的功能量身定制源代码,
  • make,实际上会编译共享库,可执行文件等,
  • make check,它会我们安装软件包之前运行测试,
  • make install,如果程序包运行正常,最后(可选)
  • make installcheck,以确保安装正常。

在期间make,共享库和可执行文件以最终形式进行编译:可执行文件在最终目标位置依赖于共享库进行编译(即,它们依赖于库,/usr/local/lib尽管它们尚不存在,但仍在构建中)树)。然后make install,大致来说,它只是cp用于从构建树到最终位置安装库和可执行文件。

在此make check阶段中,我们正在运行已卸载的程序:共享库,可执行文件和辅助文件仍在构建树中。要运行测试,您必须设置一些自定义环境变量(例如,告诉您的程序辅助数据文件不在/usr/local/share源树中,而是在源树中),以及一些系统环境变量,以告诉您的共享库加载器看起来共享库。传统Unices上的环境变量是LD_LIBRARY_PATHOS X上的DYLD_LIBRARY_PATH。这已经工作了几十年了。

但是现在,El Capitan打破了这一点。

$ (export FOO=foo; env) | grep foo
FOO=foo
$ (export DYLDFOO=foo; env) | grep foo
DYLDFOO=foo
$ (export DYLD_FOO=foo; env) | grep foo
$

现在,启用SIP后,no不会DYLD_*从进程导出到其子进程。

所以我的问题是:我们如何运行未安装的程序?能够运行传统的Unix序列应遵循的程序是什么./configure && make && make check

,没有诸如“ make install先运行”之类的答案。那不是重点。我是一名开发人员,因此我经常执行“ make check”(并且通常运行程序的未安装版本)。即使将其安装到虚拟的地方也很耗时。我需要的东西有效,并且高效。禁用SIP不能为要运行我的软件包的用户解决此问题make check


我仍然可以DYLD_INSERT_LIBRARIES=$HOME/.bin/lib/Apple80211 /Applications/Utilities/AirPort\ Utility\ 5.6.app/Contents/MacOS/AirPort\ Utility\ 5.6在10.11以下运行旧的APU(带有旧的库)(即使变量未显示在中env)。奇怪(但可以)。
nohillside

Answers:


6

似乎DYLD_ *仅被剥离用于“受保护的”二进制文件(我不确定这到底是什么意思,但显然是/ bin和/ usr / bin中的任何内容对于初学者来说),但是,如果您复制/ usr / bin / env到其他地方,它可以保留DYLD_ *的东西:

$ cp /usr/bin/env ~/Desktop; (DYLD_FOO=bar ~/Desktop/env)|grep DY
dyld: warning, unknown environment variable: DYLD_FOO
DYLD_FOO=bar

我认为make总是通过/ bin / sh运行命令,因此您不能在makefile中设置“危险”变量并使它们影响命令,但是也许您可以将测试移至Shell脚本中,在脚本,然后从make调用脚本。虽然很明显,但是如果测试反过来依赖于shell脚本(或者如果测试的东西 shell脚本!),这对您没有帮助,因为这将导致它们将调用/ bin / sh并再次丢失变量。 。


非常感谢!现在我可以了cp /bin/sh,并使用该shell代替真正的shell。符号链接不会起作用,硬链接是“不允许操作”,所以我想我必须忍受cp
akim 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.