是什么让 OSX 程序无法在 Linux 上运行?

Fal*_*rri 42 linux osx compatibility executable

我知道 OSX 和 Linux 之间有很多区别,但是是什么让它们如此完全不同,以至于它们根本不兼容?

eph*_*ent 58

整个ABI是不同的,不仅仅是 sepp2k 提到的二进制格式(Mach-O 与 ELF)。

例如,虽然 Linux 和 Darwin/XNU(OS X 的内核)sc在 PowerPC 和int 0x80/ sysenter/syscall在 x86 上用于系统调用入口,但从那以后就没有太多共同之处了。

Darwin 在 Mach 微内核中引导负系统调用号,在 BSD 单片内核中引导正系统调用号——参见xnu/osfmk/mach/syscall_sw.hxnu/bsd/kern/syscalls.master。Linux 的系统调用号因架构而异——参见linux/arch/powerpc/include/asm/unistd.hlinux/arch/x86/include/asm/unistd_32.hlinux/arch/x86/include/asm/unistd_64.h ——但都是非负的。所以很明显系统调用号、系统调用参数,甚至存在哪些系统调用都是不同的。

标准 C 运行时库也不同;Darwin 主要继承了 FreeBSD 的 libc,而 Linux 通常使用 glibc(但也有替代品,如 eglibc 和dietlibc 以及 uclibc 和 Bionic)。

更不用说整个图形堆栈是不同的;忽略整个 Cocoa Objective-C 库,OS X 上的 GUI 程序通过 Mach 端口与 WindowServer 通信,而在 Linux 上,GUI 程序通常使用 X11 协议通过 UNIX 域套接字与 X 服务器通信。当然,也有例外; 你可以在 Darwin 上运行 X,你可以在 Linux 上绕过 X,但是 OS X 应用程序绝对不会说 X。

像 Wine 一样,如果有人把工作投入到

  • 为 Mach-O 实现二进制加载器
  • 捕获每个 XNU 系统调用并将其转换为适当的 Linux 系统调用
  • 根据需要编写像 CoreFoundation 这样的 OS X 库的替代品
  • 根据需要编写 WindowServer 等 OS X 服务的替代品

那么就可以在 Linux 上“本地”运行 OS X 程序。多年前,Kyle Moffet 在第一项上做了一些工作,为 Linux创建了一个原型binfmt_mach-o,但它从未完成,而且我知道没有其他类似的项目。

(理论上这是很有可能的,类似的努力已经做过很多次了;除了 Wine 之外,Linux 本身也支持运行来自其他 UNIX 的二进制文件,例如 HP-UX 和 Tru64,而Glendix项目旨在将 Plan 9 兼容性引入到Linux。)


有人已经投入实施的Mach-O二进制装载机和API翻译器适用于Linux的努力!

shinh/maloader - GitHub采用类似 Wine 的方法加载二进制文件并捕获/翻译用户空间中的所有库调用。它完全忽略系统调用和所有与图形相关的库,但足以让许多控制台程序工作。

Darling建立在 maloader 之上,添加了库和其他支持运行时位。


sep*_*p2k 22

为什么 OSX 应用程序不能在 linux 上本地运行:

首先,OSX 使用与 Linux 不同的二进制格式,因此 Linux 无法执行为 OSX 编译的二进制文件(就像它无法执行为 Windows 或 BSD 编译的二进制文件一样)。

其次,如果您谈论的是 GUI 应用程序,Apple 的 GUI 工具包 Cocoa a) 仅适用于 OSX,而​​ b) 不能在 X11 上运行。

为什么 OSX 应用程序没有对应的 wine:

在葡萄酒甚至可以使用一半之前,还需要做很多工作。由于对 OSX 等价物的需求没有那么多,因此还没有人为这样的项目投入同样多的精力。


小智 7

OS X 应用程序无法在 Linux 上运行的最重要原因是这些操作系统使用了不同的系统调用。

之前的一些答案提到了库,但通常情况并非如此 - Core Foundation 主要由 Apple 以 CFLite 的名义开源,并且可以轻松移植到任何平台(iTunes 的 Windows 版本实际上位于 Core Foundation 的 Windows 端口之上,并且与一些编译器调整,你可以直接在 Linux 发行版上使用 clang 制作 CFLite)并且还有一些开源的努力将 Objective-C 环境移植到 Linux,主要是 Foundation 和 AppKit,最著名的是 GNUstep,一个 OpenStep 的 GNU 实现,日期为早于 Apple 的 Cocoa(开始时还有 NeXT Computer 公司。)

如果有人确定,他们可以设计一个加载器来捕获每个 Mach-O 系统调用并将其转换为相应的 Linux 系统调用,并通过适当的 ABI 转换将这些开源库“对应物”动态链接到二进制文件。

仅供参考,如果您可以获得 Mach-O 应用程序的源代码,您可以考虑移植它,结果可能会非常简单。例如,在剥离几行(非关键)CF 代码后,与 OS X 10.6 捆绑的 TextEdit 应用程序可以直接重新编译链接到 GNUstep,因此在 Linux 下立即可用(更不用说与 GNUstep 一起提供的 TextEdit 实际上是一个直接从 NeXTSTEP 重新编译 TextEdit 应用程序,它也是 OS X 的前身,甚至保留了它的“© 1995 NeXT”标签)。TextEdit 在 BSD 许可下。