Mac OS X El Capitan能否运行为Yosemite编译的软件,该软件需要/ usr / gnu64 / lib中的库?

时间:2015-10-12 06:25:34

标签: c macos osx-elcapitan

抱歉,有一些必要的背景知识 - 您可以尝试跳转到问题标题。

自远古以来(无论如何,在上一个千年的某个地方),我创建了诸如/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(系统完整性保护)系统(在What is the "rootless" feature of El Capitan, really?上描述'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中备用空间的另一个MachineB; /usr中的符号链接允许代码位于/work1/gcc/work5/gcc中,只要/usr/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都不能清理,即使我cd层次结构到底部。即使剩下大量空间,它也会出现“磁盘空间不足”错误。我可以使用Finder将层次结构移动到废纸篓。但Finder也无法删除它们。 Bash有一个tizzy因为它无法解决当前目录的问题。这有点痛苦!所以重新编译和重新安装一些软件并不是一件容易的事。我甚至可能最终使用其他人编译的东西(MacPorts,HomeBrew等),但我希望能够编译自己的东西。我收到错误'操作无法完成,因为项目“confdir-14B ---”正在使用中“;重启可能是有序的,但我不相信它会解决这个问题。

1 个答案:

答案 0 :(得分:0)

只是为了关闭:

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

如果您想要关注聊天链接,请务必这样做,但最终会得出同样的结论。