Mac OS X El Capitan可以运行为Yosemite编译的软件,它需要/ usr / gnu64 / lib中的库吗?

对不起,有一些必要的背景 – 您可以尝试跳到问题标题。

从远古时代开始(无论如何,在上一个千年的某个地方),我创建了诸如/usr/gnu/usr/gcc来保存自定义编译的GNU软件,与系统目录中的任何内容分开。 这对我来说非常适用于各种基于Unix的系统,包括自2002年以来的Mac OS X(Jaguar,10.2)。 (不使用/usr/local一个原因是IT管理部门维护它,并且它总是包含过时的代码 – 例如,它在大约5年前就可以使用Perl 4。使用其他名称可以避免与它们一起运行。)

在Mac OS X 10.11 El Capitan中,Apple推出了SIP(系统完整性保护)系统(描述了El Capitan的“无根”function,真的是“Ask Different”)。 这意味着我不能再创建诸如/usr/gnu/usr/gcc ,即使它们与Apple所拥有的任何内容脱节。

我发现之前在这些目录中的软件已被隔离在这些目录中(其中UUID在您的机器上会有所不同,我可能有两个因为将El Capitan放到这台机器上是一个多步操作 – 一个单独的长和无聊的故事):

 $ ls -1 /Library/SystemMigration/History/ Migration-7D74B534-AA54-4A4A-8DCC-A5C2F28E1A39 Migration-9C0FE7A4-3445-4BD6-A512-35464EECCBC3 $ 

然后在QuarantineRoot下的子目录中:

 $ ls /Library/SystemMigration/History/Migration-9C0FE7A4-3445-4BD6-A512-35464EECCBC3/QuarantineRoot/usr: gcc gnu32 gnu64 $ 

但是,二进制文件是使用GCC和各种库编译的,因此它们目前不运行。 例如:

 $ otool -L bison bison: /usr/gnu64/lib/libintl.8.dylib (compatibility version 10.0.0, current version 10.1.0) /usr/gnu64/lib/libiconv.2.dylib (compatibility version 8.0.0, current version 8.1.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0) /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 744.18.0) /usr/gcc/v4.7.1/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0) $ ./bison dyld: Library not loaded: /usr/gnu64/lib/libintl.8.dylib Referenced from: /Library/SystemMigration/History/Migration-9C0FE7A4-3445-4BD6-A512-35464EECCBC3/QuarantineRoot/usr/gnu64/bin/./bison Reason: image not found Trace/BPT trap: 5 $ 

AFAIK,我甚至无法在/usr创建符号链接,使得gccgnu64指向其他地方(甚至不以root权限运行)。 这是我用过在MachineA上创建软件的技术之一,其中/work1有备用空间,用于另一台备用空间为/work5 ; /usr的符号链接允许代码位于/work1/gcc/work5/gcc ,只要/usr/gcc指向文件实际安装的位置,它/work5/gcc正常工作。 因此,这个SIP系统似乎杀死了几十年来成功使用的所有机制,这些机制基于能够在/usr创建至少某种目录条目。

  • 是否有一种合理的方法可以在不禁用SIP的情况下运行旧二进制文件,而无需立即重新编译所有内容?

后备位置是“重新编译软件 – 避免/usr作为安装位置”。 随着时间的推移,我计划使用/opt/gcc/opt/gnu64而不是/usr下的等价物。 我甚至考虑在我的主目录下使用空间,即使我不愿意; 它是’系统’软件。

但是,我已经编译了很多软件,包括GCC的多个版本(从4.4.2到5.2.0),这将是一个令人讨厌的重新编译。 事实上,我将不得不放弃旧版本的GCC,我不经常使用它,但是当我需要它们时它们很有用。


哦,我对GNU Tar的配置脚本(1.28和1.26)有问题。 它测试它可以创建的目录树的深度,然后无法清理。 rmrmdir都不能清理,即使我将层次结构降低到底部。 即使剩下大量空间,它也会出现“磁盘空间不足”错误。 我可以使用Finder将层次结构移动到垃圾箱。 但Finder也无法删除它们。 Bash有一个tizzy因为它无法解决当前目录的问题。 这有点痛苦! 所以重新编译和重新安装一些软件并不是一件容易的事。 我甚至可能最终使用其他人编译的东西(MacPorts,HomeBrew等),但我希望能够编译自己的东西。 我收到错误’操作无法完成,因为项目“confdir-14B —”正在使用中“; 重启可能是有序的,但我不相信它会解决这个问题。

只是为了关闭:

  • 没有; 似乎没有办法避免重新编译代码。

如果你想按照聊天链接,一定要这样做,但它最终会得出同样的结论。