可以 Mac OS X El Capitan 运行 为 Yosemite 编译的软件是否需要 /usr/gnu64/lib 中的库?
Can Mac OS X El Capitan run software compiled for Yosemite that expects libraries in /usr/gnu64/lib?
抱歉,需要一些背景知识——您可以尝试跳到问题标题。
自远古以来(无论如何,在上个千年的某个时候),我已经创建了目录,例如 /usr/gnu
和 /usr/gcc
来保存 custom-compiled GNU 软件,与任何东西分开系统目录。这对我来说效果很好,在各种各样的 Unix-based 系统上,包括 Mac OS X 自 2002 年以来(Jaguar,10.2)。 (不使用 /usr/local
的一个原因是 IT 管理维护它,并且它总是包含陈旧的代码——例如,它直到大约 5 年前才提供 Perl 4。使用其他名称避免 run-ins他们。)
在 Mac OS X 10.11 El Capitan 中,Apple 引入了 SIP(系统完整性保护)系统(在 'Ask Different' 上的 What is the "rootless" feature of El Capitan, really? 中进行了描述)。这意味着我不能再创建诸如 /usr/gnu
或 /usr/gcc
之类的目录,即使它们与 Apple 拥有的任何内容都不相交。
我发现以前在这些目录中的软件已被隔离在这样的目录中(UUID 在您的机器上会有所不同,我可能有两个,因为将 El Capitan 安装到这台机器上是一个 multi-step 行动——一个单独的又长又无聊的故事):
$ ls -1 /Library/SystemMigration/History/
Migration-7D74B534-AA54-4A4A-8DCC-A5C2F28E1A39
Migration-9C0FE7A4-3445-4BD6-A512-35464EECCBC3
$
然后在 QuarantineRoot
下的 sub-directories 中:
$ 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
中创建符号链接,使得 gcc
或 gnu64
指向其他地方(甚至 运行 root 权限)。这是我用来在 MachineA 上创建软件的技术之一,在 /work1
中使用备用 space,以便在另一个 MachineB 中使用备用 space /work5
; /usr
中的符号链接允许代码位于 /work1/gcc
或 /work5/gcc
中,只要 /usr/gcc
指向文件的实际安装位置,它就可以正常工作。因此,这个 SIP 系统似乎扼杀了几十年来成功使用的所有机制,这些机制基于能够在 /usr
.
中至少创建某种目录条目。
问题
- 有没有一种明智的方法可以让旧的二进制文件成为 运行 而无需 禁用 SIP 并且不必立即重新编译所有内容?
fall-back的位置是"recompile the software — avoiding /usr
as an install location"。随着时间的推移,我计划使用 /opt/gcc
和 /opt/gnu64
而不是 /usr
下的等效项。我什至考虑在我的主目录下使用 space,尽管我不想这样做;它是 'system' 软件。
不过,我已经编译了很多软件,包括多个版本的GCC(从4.4.2到5.2.0),重新编译会很麻烦。事实上,我将不得不放弃旧版本的 GCC,我不经常使用它,但是当我需要它们时它们很有用。
哦,GNU Tar(1.28 和 1.26)的配置脚本有问题。它测试它可以创建多深的目录树,然后无法 clean-up。而且 rm
和 rmdir
都无法清理,即使我 cd
将层次结构降到底部。它得到一个 'out of disk space' 错误,即使还有很多 space 剩余。我可以使用 Finder 将层次结构移至废纸篓。但 Finder 也无法删除它们。 Bash 有点头晕,因为它无法计算出当前目录是什么。这一切有点痛苦!因此,重新编译和重新安装某些软件并非易事。我什至最终可能会使用其他人编译的东西(MacPorts、HomeBrew 等),但我希望能够自己编译。我收到错误 'The operation can’t be completed because the item “confdir-14B---” is in use';可能需要重新启动,但我不确定它会解决该问题。
为了结束:
- 没有;似乎没有办法避免重新编译代码。
如果你想关注聊天 link,一定要关注,但结果是一样的。
抱歉,需要一些背景知识——您可以尝试跳到问题标题。
自远古以来(无论如何,在上个千年的某个时候),我已经创建了目录,例如 /usr/gnu
和 /usr/gcc
来保存 custom-compiled GNU 软件,与任何东西分开系统目录。这对我来说效果很好,在各种各样的 Unix-based 系统上,包括 Mac OS X 自 2002 年以来(Jaguar,10.2)。 (不使用 /usr/local
的一个原因是 IT 管理维护它,并且它总是包含陈旧的代码——例如,它直到大约 5 年前才提供 Perl 4。使用其他名称避免 run-ins他们。)
在 Mac OS X 10.11 El Capitan 中,Apple 引入了 SIP(系统完整性保护)系统(在 'Ask Different' 上的 What is the "rootless" feature of El Capitan, really? 中进行了描述)。这意味着我不能再创建诸如 /usr/gnu
或 /usr/gcc
之类的目录,即使它们与 Apple 拥有的任何内容都不相交。
我发现以前在这些目录中的软件已被隔离在这样的目录中(UUID 在您的机器上会有所不同,我可能有两个,因为将 El Capitan 安装到这台机器上是一个 multi-step 行动——一个单独的又长又无聊的故事):
$ ls -1 /Library/SystemMigration/History/
Migration-7D74B534-AA54-4A4A-8DCC-A5C2F28E1A39
Migration-9C0FE7A4-3445-4BD6-A512-35464EECCBC3
$
然后在 QuarantineRoot
下的 sub-directories 中:
$ 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
中创建符号链接,使得 gcc
或 gnu64
指向其他地方(甚至 运行 root 权限)。这是我用来在 MachineA 上创建软件的技术之一,在 /work1
中使用备用 space,以便在另一个 MachineB 中使用备用 space /work5
; /usr
中的符号链接允许代码位于 /work1/gcc
或 /work5/gcc
中,只要 /usr/gcc
指向文件的实际安装位置,它就可以正常工作。因此,这个 SIP 系统似乎扼杀了几十年来成功使用的所有机制,这些机制基于能够在 /usr
.
问题
- 有没有一种明智的方法可以让旧的二进制文件成为 运行 而无需 禁用 SIP 并且不必立即重新编译所有内容?
fall-back的位置是"recompile the software — avoiding /usr
as an install location"。随着时间的推移,我计划使用 /opt/gcc
和 /opt/gnu64
而不是 /usr
下的等效项。我什至考虑在我的主目录下使用 space,尽管我不想这样做;它是 'system' 软件。
不过,我已经编译了很多软件,包括多个版本的GCC(从4.4.2到5.2.0),重新编译会很麻烦。事实上,我将不得不放弃旧版本的 GCC,我不经常使用它,但是当我需要它们时它们很有用。
哦,GNU Tar(1.28 和 1.26)的配置脚本有问题。它测试它可以创建多深的目录树,然后无法 clean-up。而且 rm
和 rmdir
都无法清理,即使我 cd
将层次结构降到底部。它得到一个 'out of disk space' 错误,即使还有很多 space 剩余。我可以使用 Finder 将层次结构移至废纸篓。但 Finder 也无法删除它们。 Bash 有点头晕,因为它无法计算出当前目录是什么。这一切有点痛苦!因此,重新编译和重新安装某些软件并非易事。我什至最终可能会使用其他人编译的东西(MacPorts、HomeBrew 等),但我希望能够自己编译。我收到错误 'The operation can’t be completed because the item “confdir-14B---” is in use';可能需要重新启动,但我不确定它会解决该问题。
为了结束:
- 没有;似乎没有办法避免重新编译代码。
如果你想关注聊天 link,一定要关注,但结果是一样的。