模組資訊串流

簡介

模組資訊串流(以下簡稱 Modi 串流)包含關於單一模組(物件檔案、匯入函式庫等,這些模組構成了此 PDB 包含除錯資訊的二進制檔案)的資訊。每個模組都有一個 Modi 串流,而 Modi 串流索引與模組之間的映射關係包含在 DBI 串流 中。單一模組的 Modi 串流包含編譯單元的行資訊,以及編譯單元中定義之符號的所有 CodeView 資訊。最後,還有一個「全域參考」子串流,但對其了解尚不深入。

串流佈局

Modi 串流的佈局如下

struct ModiStream {
  uint32_t Signature;
  uint8_t Symbols[SymbolSize-4];
  uint8_t C11LineInfo[C11Size];
  uint8_t C13LineInfo[C13Size];

  uint32_t GlobalRefsSize;
  uint8_t GlobalRefs[GlobalRefsSize];
};
  • 簽名 - 未知。實際上只觀察到數值 4。據推測,此數值對應於 cvinfo.h 中的 CV_SIGNATURE_xx 定義集,其中數值 4 表示此模組具有 C13 行資訊(而非 C11 行資訊)。由此推論,我們預期只會看到 C13 行資訊,且我們不了解 C11 行資訊的格式。

  • 符號 - CodeView 符號子串流SymbolSize 等於 模組資訊子串流 中對應模組條目的 SymByteSize 值,此子串流位於 DBI 串流 中。

  • C11LineInfo - 包含 C11 格式 CodeView 行資訊的區塊。C11Size 等於 模組資訊子串流C11ByteSize 的值,此子串流位於 DBI 串流 中。如果此數值為 0,則 C11 行資訊不存在。如先前所述,C11 行資訊的格式尚不清楚,且我們假設現代 PDB 中的所有行資訊皆為 C13 格式。

  • C13LineInfo - 包含 C13 格式 CodeView 行資訊的區塊。C13Size 等於 模組資訊子串流C13ByteSize 的值,此子串流位於 DBI 串流 中。如果此數值為 0,則 C13 行資訊不存在。

  • GlobalRefs - 此子串流的意義尚不清楚。

CodeView 符號子串流

CodeView 符號子串流。這是一個可變長度記錄的陣列,描述了編譯單元中定義的函數、變數、內聯資訊和其他符號。整個陣列佔用 SymbolSize-4 位元組。CodeView 符號記錄(以及 CodeView 符號記錄陣列)的格式在 CodeView 符號記錄 中描述。