為什麼可執行檔需要二進位格式規格?

為什麼可執行檔需要二進位格式規格?

據我了解,像 Linux 或 Windows 這樣的作業系統是用 C/C++ 編寫的,並編譯為給定的體系結構(例如 AMD64),以產生適合該體系結構的機器碼。

我的問題 -

  1. 為什麼二進位程式碼需要單獨的規格 - Linux 使用 ELF 而 Windows 使用可移植可執行格式?
  2. 如果沒有這種二進位格式規範,是否可以建立作業系統以及在該作業系統上執行的程式?
  3. 二進位格式是:依賴體系結構、依賴作業系統還是兩者都依賴?
  4. 二進位格式僅適用於可執行檔還是也適用於作業系統程式碼?

答案1

正如您可能已經猜到的,可執行格式不僅僅包含機器代碼。例如,他們可以:

  • 指定作業系統的元數據,例如可執行檔適用於哪種體系結構。該元資料包括標頭文件的。

  • 指定程式佈局在記憶中。在現代作業系統上,大多數可執行檔案不會以單一區塊的形式載入到記憶體中 - 它們通常有許多單獨的區塊地區/部分/。其中一些段將包含可執行程式碼。其中一些將包含不可變數據,例如文字字串。其中一些將被指定為程式堆的可寫記憶體。

    不同的程序對這些部分的大小會有不同的要求(要求)。這一切都在標題中指定。

  • 某些格式還允許您嵌入電子簽名,它允許驗證二進位檔案的來源。


  1. 為什麼二進位程式碼需要單獨的規格 - Linux 使用 ELF 而 Windows 使用可移植可執行格式?

原因主要是歷史原因,作業系統傾向於堅持其現有的「本機」(或「預設」)格式,除非有令人信服的理由進行切換(例如從DOS MZ 格式到NT 3.1 中的PE,以及從在 Linux 1.2 中.out 到 ELF,多年來在各種 Unix 中從 COFF 到 ELF)。

應該注意的是,底層機器碼取決於 CPU 架構,但在其他方面(系統呼叫和連結庫除外)很大程度上可以在作業系統之間移植。事實上,現代 Windows 和 Linux 都可以運行兩種可執行格式:ELF 可執行檔將透過 WSL 在 Windows 上運行,而 PE 可執行檔將透過 WINE 在 Linux 上運行。

  1. 如果沒有這種二進位格式規範,是否可以建立作業系統以及在該作業系統上執行的程式?

我們回到這些格式的主要目的。如果沒有元資料告訴作業系統在哪裡載入程式的各個部分,大多數現代可執行檔就無法運作。一些非常古老的格式,例如通訊幾乎包含純程式碼,但不是特別靈活且已經失寵。

實際上,作業系統甚至不需要存在。在硬體級別,假設存在(傳統)BIOS,BIOS 將簡單地在磁碟上的特定位置 (MBR) 開始執行,它可以是任意機器代碼,然後接管並啟動作業系統或執行牠喜歡的任何其他操作。 (您可以將 MBR 本身視為二進位格式,儘管它與可執行程式碼沒有直接關係。)然而,更現代的 UEFI 確實指定了更複雜的可執行格式 (PE)。

  1. 二進位格式是依賴架構、作業系統還是兩者都依賴?

實際上取決於格式。某些格式採用特定的體系結構。其他允許您從標題中指定的“幻數”清單中選擇架構。還有一些完全與體系結構無關(例如 Java 和 .NET/CIL 字節碼)。

類似地,格式通常不會對作業系統施加任何限制,儘管作業系統會限制其(本機)識別和執行的格式。當然,核心作業系統之上的相容層可以執行核心作業系統可能無法辨識的其他格式(例如 JVM、.NET/CLR、WSL&WINE 等)。

  1. 二進位格式僅適用於可執行檔還是也適用於作業系統程式碼?

大多數現代作業系統的很大一部分只是「正常」可執行檔的集合。然而,作業系統的某些部分是“特殊的”,不一定使用與其餘部分相同的格式。通常,這僅適用於引導程式和核心。

要提取一個特定的、非常常見的範例,傳統 BIOS 引導程式將不是可以是 Linux 和 Windows 使用的 ELF 或 PE 格式。 Linux 核心通常建構在ELF 派生格式GRUB 引導程式可以載入,但它可能採用不同的格式以與所使用的引導程式相容。 Linux 核心也支援EFI 存根模式,其中包含最小的 PE/COFF 標頭,以與直接 UEFI 啟動相容。

答案2

該格式的主要用途是將程式載入到記憶體中,這是由一個裝載機

  1. 為什麼二進位程式碼需要單獨的規格 - Linux 使用 ELF 而 Windows 使用可移植執行格式?

禮貌的回答:因為作業系統不同,有不同的要求。 Unix 人回答:因為微軟喜歡重新發明(方形)輪子。

  1. 如果沒有這種二進位格式規範,是否可以建立作業系統以及在該作業系統上執行的程式?

是的,但只有非常簡單的那些,一個相當基本的作業系統,運行不需要「重新定位」並且不需要連結到任何外部程式碼的簡單程式。

  1. 二進位格式是依賴架構、作業系統還是兩者都依賴?

沒有,ELF 格式用於許多作業系統和體系結構。

  1. 二進位格式僅適用於可執行檔還是也適用於作業系統程式碼?

在Linux中,可啟動核心可能不是ELF,但核心模組使用ELF格式。

相關內容