首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

托管 PE 檔案結構深度解析:CLR 標頭、中繼資料與區段詳解

     編輯:關於.NET

.NET 框架將各種語言編譯為通用的 Microsoft Intermediate Language (MSIL/IL),再由 JIT 編譯器轉換為原生碼。編譯器同時產生中繼資料,描述型別定義、成員簽名與參考資訊。IL 與中繼資料封裝於可攜式執行檔 (PE) 中,本文聚焦托管 PE 的特殊結構。

托管 PE 格式概覽

標準 PE/COFF 標頭包含 DOS 標頭、PE 標誌、COFF 標頭與 PE 選擇性標頭。CLR 擴充了 PE 格式,在 PE 選擇性標頭的資料目錄中新增 CLR 標頭指標(如圖 1-4)。

圖 1-4 托管 PE 檔案格式

PE32 可跑 32/64 位元,PE32+ 僅限 64 位元。CLR 標頭包含執行階段版本、旗標、進入點、中繼資料位置/大小、資源、強名稱簽章等資訊(定義於 CorHdr.h,代碼清單 1-4)。

CLR 標頭關鍵欄位

表 1-1 列出各欄位用途:MetaData 指向中繼資料區塊,Flags 標示純 IL/32BITREQUIRED 等,EntryPointToken/RVA 為進入點,Resources、StrongNameSignature、VTableFixups 等目錄支援資源、強名稱、虛擬表修正。

主要區段詳細說明

1. .reloc 重定位區段

包含 Fixup 表,供載入器在基址衝突時調整位址。若 CLR 標頭標示純 IL (COMIMAGE_FLAGS_ILONLY),Windows XP 以上系統會忽略此區段。

2. .text 文字區段(唯讀)

托管 PE 中最大變動處,含中繼資料表、IL 碼、匯入表、CLR 標頭、非托管啟動存根、托管資源、強名稱雜湊、偵錯資料、非托管匯出存根(圖 1-6)。

圖 1-6 .text 區段通用結構

3. .sdata/.data 資料區段(可讀寫)

含資料常數、V 表、非托管匯出表、TLS 目錄結構。V 表用於將托管方法暴露給非托管代碼呼叫,槽位在執行期替換為方法位址或封送 thunk,故必須置於可寫區段。

4. .rsrc 非托管資源區段

傳統 PE 資源(圖示、字串表等),由 PE 標頭資源目錄指向。

5. 托管資源

位於 .text 區段連續儲存,CLR 標頭 Resources 目錄指向起始 RVA。中繼資料 ManifestResource 記錄資源名稱與偏移,資料前 4 位元組標示長度。

6. .tls 執行緒區域儲存區段

儲存 TLS 模板資料,目錄結構定義於 Winnt.h(代碼清單 1-6),RVA/大小在 PE 標頭第 10 個資料目錄。

作者:玄魂
出處:https://www.cnblogs.com/xuanhun/

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved