簡體   English   中英

Linux 可執行文件是否與 OS X“兼容”?

[英]Is a Linux executable “compatible” with OS X?

如果你在基於 Linux 的平台上用 C 編譯一個程序,然后將它移植到使用 MacOS 庫,它會工作嗎?

來自編譯器的核心機器代碼在 Mac 和 Linux 上都兼容嗎?

我問這個的原因是因為兩者都是“基於 UNIX”的,所以我認為這是真的,但我不確定。

不,Linux 和 Mac OS X 二進制文件不能交叉兼容。

一方面,Linux 可執行文件使用一種稱為ELF的格式。

Mac OS X 可執行文件使用Mach-O 格式

因此,即使許多庫通常在每個系統上單獨編譯,它們也不會以二進制格式進行移植。

此外,Linux 實際上並不是基於 UNIX 的。 它確實與 UNIX 共享許多共同的特性和工具,但其中很多都與 POSIX 等計算標准有關。

綜上所述,人們可以並且確實創造了非常酷的方法來處理交叉兼容性問題。

編輯:

最后,為了解決您對字節碼的看法:在制作二進制文件時,編譯器通常會生成特定於您正在開發的平台的機器代碼 (情況並非總是如此,但通常如此。)

通常,您可以輕松地跨各種 Unix 品牌移植程序。 但是,您需要(至少)在每個平台上重新編譯它。

可執行文件(二進制文件)在多個平台上不可用,因為可執行文件與操作系統的 ABI(應用程序二進制接口)緊密耦合,即應用程序如何與操作系統通信的約定。

例如,如果您的程序使用 POSIX write調用在控制台上打印一個字符串,則 ABI 指定:

  • 系統調用是如何完成的(Linux 過去在 x86 上調用 0x80 軟件中斷,現在它使用特定的sysenter指令)
  • 系統調用號
  • 函數的參數如何傳輸到系統
  • 任何類型的對齊
  • ...

這在操作系統之間有很大差異。

但是請注意,在某些情況下,可能會有“ABI 適配器”允許將一個操作系統的二進制文件運行到另一個操作系統上。 例如, Wine允許您在各種 Unix 版本上運行 Windows 可執行文件, NDISwrapper允許您在 Linux 上使用 Windows 網絡驅動程序。

“字節碼”通常是指由虛擬機執行的代碼(例如對於 java 或 python)。 C被編譯成機器碼,CPU可以直接執行。 機器語言是特定於硬件的,因此它在英特爾芯片上運行的任何操作系統(甚至在 Windows 下)下都是相同的,但機器代碼如何包裝到可執行文件中的細節,以及它如何與系統調用集成動態鏈接庫因系統而異。

所以不,您不能采用編譯后的代碼並在不同的操作系統中使用它。 (但是,有一些“交叉編譯器”可以在一個操作系統上運行,但生成的代碼可以在另一個操作系統上運行)。

沒有“來自編譯器的核心字節碼”。 只有機器碼

雖然相同的機器指令可能適用於多個操作系統(只要它們在相同的硬件上運行),托管的可執行文件遠不止這些,而且由於 Linux 的編譯和鏈接的本機可執行文件有很大不同BSD 或 Darwin 上的運行時和庫要求,您將無法在另一個系統上運行一個二進制文件。

相比之下,Windows可執行文件有時可以在Linux下運行,因為Linux提供了用於Windows的PE格式的二進制格式加載程序,以及廣泛的API實現(酒)。 原則上這個想法也可以在其他平台上使用,但我不知道有人為 Linux<->Darwin 寫過這個。 如果您已經擁有源代碼,並且它可以在 Linux 中編譯,那么您也很有可能在 MacOS 下進行編譯(當然是模 UI 組件)。

好吧,也許……但很可能不是。

但如果是這樣,則不是“因為兩者都是 UNIX”,而是因為:

  • Mac 電腦現在碰巧使用相同的處理器(這在過去非常不同)
  • 您碰巧使用了一個完全不依賴任何庫的程序(不太可能)
  • 您碰巧使用相同的運行時庫
  • 您碰巧使用了與兩者兼容的加載程序/二進制格式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM