[英]Is there any difference between executable binary files between distributions?
由於所有 Linux 發行版都使用相同的內核,它們的可執行二進制文件之間有什么區別嗎?
如果是,主要區別是什么? 或者這是否意味着我們可以構建一個通用的 linux 可執行文件?
所有 Linux 發行版都使用相同的二進制格式 ELF,但仍然存在一些差異:
因此,如果您希望您的程序在所有發行版上運行,您可能必須靜態鏈接一個僅依賴於內核系統調用的版本,即使這樣您也只能運行指定的架構。
如果你真的想在任何 arch 上運行一個程序,那么你必須為所有 arch 編譯二進制文件,並使用 shell 腳本來啟動正確的。
所有 Linux 端口(即不同處理器上的 Linux 內核)都使用ELF作為可執行文件和庫的文件格式。 特定的 ELF 二進制文件標有它可以在其上運行的單個體系結構/操作系統(盡管某些操作系統具有從其他操作系統運行 ELF 二進制文件的兼容性)。
大多數端口都支持舊的a.out格式。 (有些處理器足夠新,以至於從來沒有任何適用於它們的 a.out 可執行文件。)
一些端口也支持其他可執行文件格式; 例如,PA-RISC 端口支持 HP-UX 的舊SOM可執行文件,μcLinux (nonmmu) 端口支持它們自己的 FLAT 格式。
Linux 也有binfmt_misc
,它允許用戶空間注冊任意二進制格式的處理程序。 一些發行版利用這一點來執行 Windows、.NET 或 Java 應用程序——它實際上仍在啟動一個解釋器,但它對用戶是完全透明的。
Linux on Alpha 支持加載 Intel 二進制文件,這些文件通過em86
模擬器運行。
可以為其他架構的可執行文件注冊binfmt_misc
,以便與qemu-user一起運行。
理論上,我們可以為胖二進制文件創建一種新格式——也許在 ELF 中注冊一種新的“架構”。 然后內核binfmt
加載器必須了解這種新格式,您不會想錯過ld-linux.so
動態鏈接器和整個構建工具鏈。 對這樣的功能幾乎沒有興趣,據我所知,沒有人在做類似的事情。
幾乎所有的 linux 程序文件都使用ELF標准。
舊的 Unix 也使用COFF格式。 您可能仍會以這種格式找到昔日的可執行文件。 Linux 仍然支持它(不過我不知道它是否在當前發行版中編譯)。
如果您想創建一個運行所有 Linux 發行版的程序,您可以考慮使用腳本語言(如Python
和Perl
)或獨立於平台的編程語言(如Java
。
用腳本語言編寫的程序在執行時被編譯,這意味着它們總是被編譯以匹配它們執行的平台,因此,應該總是工作(假設庫設置正確)。
另一方面,用Java
編寫的程序在分發之前進行編譯,但只要安裝了 Java VM,就可以在任何 Linux 發行版上執行。
此外,用Java
編寫的Java
可以在其他操作系統上運行,如MS Windows
和Mac OS
。
許多用Python
和Perl
編寫的程序也是如此; 然而, Python
或Perl
程序是否可以在另一個操作系統上運行取決於該程序使用哪些庫以及這些庫是否在其他操作系統上可用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.