Mac OS X 和 Linux 之間的二進制兼容性
振作起來,這個問題可能會顯得幼稚和/或愚蠢,因為我對類 unix 系統的內部工作和一般程式相對較新。
準備好?好的!我將經歷大約 3 個可笑級別,隨著我的進行而增加。
我們有兩個硬體相似的系統(重點是處理器,讓我們說一個標準的英特爾酷睿 2 雙核)。
一個正在執行(在此處插入您的 linux 發行版:Ubuntu 將在以後使用),另一個正在執行,比如說 Mac OS X。
編譯一個等效的程序,讓我們說一下:
int main() { int cat = 33; int dog = 5*cat; return dog; }
程式碼非常簡單,因為我還不想考慮共享庫的含義。
在各自的系統上編譯時。輸出之間的主要區別不是 ELF 與 Mach-O 的問題嗎?如果要剝離格式的每個二進製文件,留下一個平面二進製文件,反彙編的機器指令會不會是一樣的?(可能有一些差異取決於編譯器的習慣/傾向)。
**1.)**如果要開發一個程序,以 Mach-O 格式重新打包從我們的 Ubuntu 系統生成的平面二進製文件,它會在 Mac OS X 系統中執行嗎?那麼,如果一個人只有上面假定程序的編譯二進製文件,並且一個人有這個重新打包平面二進製文件的神秘工具,那麼簡單的程序是否能夠在 Mac OS X 系統上執行?
現在讓我們更進一步。
我們現在有一個帶有原始碼的程序,例如:
#include <stdio.h> int main() { printf("I like tortoises, but not porpoises"); return 0; }
**2.)**假設這個程序是編譯和靜態連結的,我們的神奇程序是否仍然能夠以 Mach-O 格式重新打包原始二進製文件並讓它在 mac os X 上執行?看到它不需要依賴任何其他二進製文件,(在這種情況下mac系統不會有)
現在進入最後一關;
**3.)**如果我們使用這個假定的程序將所有必要的共享庫轉換為 Mach-O 格式,然後用動態連結編譯上面的程序會怎樣。程序還能成功執行嗎?
現在應該就是這樣了,顯然每一步的荒謬都依賴於之前的基礎,甚至是有意義的。所以如果第一根柱子被摧毀,我懷疑剩下的層次會有多大的功德。
我絕對不會考慮到帶有 GUI 的程序來考慮這一點。視窗系統可能是另一個令人頭疼的問題。在這個階段我只考慮命令行程序。
現在,我邀請世界來糾正我,並告訴我我荒謬的想法的所有錯誤。
您忘記了一件關鍵的事情,即您的程序必須與作業系統互動才能做任何有趣的事情。
Linux 和 OS X 之間的約定是不同的,因此相同的二進製文件不能按原樣執行,除非本質上沒有一大塊依賴於作業系統的程式碼能夠與之互動。其中許多東西是通過庫提供的,然後您需要連結到這些庫中,這意味著您的程序需要是可連結的,並且兩個系統之間的連結也不同。
就這樣繼續下去。表面上聽起來像在做同樣的事情,但在實際細節上卻大不相同。