Linux

是什麼讓 OSX 程序無法在 Linux 上執行?

  • February 11, 2015

我知道 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.hxnu/bsd/kern/syscalls.master。Linux 的 syscall 編號因架構而異 — 參見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 系統呼叫
  • 根據需要為 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 建構,添加了庫和其他支持執行時位。

引用自:https://unix.stackexchange.com/questions/3322