爲什麼同一個程序不能在兩種操作系統上分別運行?

最初試解:
你可以這樣想一下, 爲啥記事本不能打開 .map4 的文件?因爲記事本只能打開 .txt 類型的文件。

由程序進行探索:
你可以看看下面這段函數:
在這裏插入圖片描述
然後進行編譯,反彙編:
在這裏插入圖片描述在這裏插入圖片描述
雖然兩個函數的起止地址都是從00000…開始的,那在主函數中 call sub 函數時,怎麼知道調用函數的入口在哪呢? 如果我們直接執行這個 test.o 文件時,是會報錯的。

第一個報錯原因是因爲沒有權限:
在這裏插入圖片描述
當我使用 chmod 改變權限,使其有執行權限時,會報啥錯呢?
在這裏插入圖片描述正如你所看到的,無法執行二進制文件。

我們從比編寫代碼到最後執行的步驟是:
源代碼 --》 編譯器 --》彙編碼 --》 彙編器 --》 機器碼

這裏的 test.o 文件是目標文件,並不是可執行文件。
一般要經歷兩個大的方向纔可成執行文件:
1 , 編譯,彙編,鏈接----》可執行文件
2, 裝載器,可執行文件—》load --> 內存
在這裏插入圖片描述
ELF : 框住函數即一切家屬

在這裏插入圖片描述
ELF作用:
在這裏插入圖片描述
過程:
首先操作系統會掃描 ELF 格式的文件,取出每個文件內的符號表合併成全局符號表,然後查看 重定位與解析符號表調整源碼中的程序入口。(就像上面代碼中 sub , main 的地址都是從 0000… 開始的)然後將 代碼段和數據段 加載如鏈接文件,裝載器載入內存,CPU開始讀取內存指令。

總結:
我想到這裏你應該知道了,爲啥同一個 CPU 不同的操作系統卻不能執行同一個可執行文件,最本質的原因是 文件格式不同。 Linux 的文件是 ELF 而 windowns 的是 PE。但有些軟件可以是 OS 兼容的,但從性能方面考慮並不是那麼理想。

發佈了50 篇原創文章 · 獲贊 58 · 訪問量 2420
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章