是什麼讓 OSX 程序無法在 Linux 上執行?
我知道 OSX 和 Linux 之間有很多不同之處,但是是什麼讓它們如此完全不同,從而使它們從根本上不兼容?
整個ABI是不同的,不僅僅是 sepp2k 提到的二進制格式(Mach-O 與 ELF)。
例如,雖然 Linux 和 Darwin/XNU(OS X 的核心)都
sc
在 PowerPC 和int 0x80
/sysenter
/syscall
在 x86 上用於系統呼叫條目,但從那以後就沒有太多共同之處了。達爾文在 Mach 微核心上指定負系統呼叫號,在 BSD 單片核心上指定正系統呼叫號 - 請參閱xnu/osfmk/mach/syscall_sw.h和xnu/bsd/kern/syscalls.master。Linux 的 syscall 編號因架構而異 — 參見linux/arch/powerpc/include/asm/unistd.h、linux/arch/x86/include/asm/unistd_32.h和linux/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 系統呼叫
- 根據需要為 OS X 庫(如 CoreFoundation)編寫替代品
- 根據需要編寫 WindowServer 等 OS X 服務的替代品
那麼在 Linux 上“本機”執行 OS X 程序是可能的。多年前,Kyle Moffet 在第一個項目上做了一些工作,為 Linux 創建了一個原型binfmt_mach-o,但它從未完成,而且我知道沒有其他類似的項目。
(理論上這是很有可能的,類似的努力已經做過很多次了;除了 Wine,Linux 本身還支持從其他 UNIX 執行二進製文件,如 HP-UX 和 Tru64,Glendix項目旨在將 Plan 9 兼容性帶到Linux。)
有人努力為 Linux 實現 Mach-O 二進制載入器和 API 翻譯器*!*
shinh/maloader - GitHub採用類似 Wine 的方法來載入二進製文件並擷取/翻譯使用者空間中的所有庫呼叫。它完全忽略了系統呼叫和所有與圖形相關的庫,但足以讓許多控制台程序正常工作。
Darling基於 maloader 建構,添加了庫和其他支持執行時位。