Binary
二進製文件可以跨不同的 CPU 架構移植嗎?
我的目標是能夠為嵌入式 Linux 進行開發。我有使用 ARM 的裸機嵌入式系統的經驗。
我有一些關於針對不同 cpu 目標進行開發的一般性問題。我的問題如下:
- 如果我有一個編譯為在“ x86 目標,linux OS 版本 xyz ”上執行的應用程序,我可以在另一個系統“ ARM 目標,linux OS 版本 xyz ”上執行相同的編譯二進製文件嗎?
- 如果上述情況不正確,唯一的方法是使用相關工具鏈“例如 arm-linux-gnueabi”來重建/重新編譯應用程序原始碼?
- 同樣,如果我有一個可載入的核心模組(設備驅動程序)在“ x86 目標,linux 作業系統版本 xyz ”上工作,我可以在另一個系統“ ARM 目標,linux 作業系統版本 xyz ”上傳入/使用相同的編譯 .ko ?
- 如果上述情況不正確,唯一的方法是使用相關工具鏈“例如 arm-linux-gnueabi”來重建/重新編譯驅動程序原始碼?
不可以。必須(重新)為目標架構編譯二進製文件,而 Linux 沒有提供開箱即用的胖二進製文件。原因是程式碼被編譯為特定架構的機器程式碼,並且大多數處理器系列之間的機器程式碼非常不同(例如 ARM 和 x86 非常不同)。
編輯:值得注意的是,某些架構提供了一定程度的向後兼容性(甚至更罕見的是,與其他架構的兼容性);在 64 位 CPU 上,向後兼容 32 位版本是很常見的(但請記住:您的依賴庫也必須是 32 位的,包括您的 C 標準庫,除非您靜態連結)。另外值得一提的是Itanium,它可以執行 x86 程式碼(僅限 32 位),儘管速度很慢;x86 程式碼的低執行速度至少是它在市場上不太成功的部分原因。
請記住,即使在兼容模式下,您仍然不能在舊 CPU 上使用使用新指令編譯的二進製文件(例如,您不能在Nehalem x86 處理器上的 32 位二進製文件中使用 AVX ;CPU 就是不支持它。
注意核心模組必須針對相關架構進行編譯;此外,32 位核心模組不適用於 64 位核心,反之亦然。
有關交叉編譯二進製文件的資訊(因此您不必在目標 ARM 設備上擁有工具鏈),請參閱下面的 grochmal 的綜合答案。