モジュール情報ストリーム

はじめに

モジュール情報ストリーム(以下、Modiストリームと呼びます)には、単一のモジュール(オブジェクトファイル、インポートライブラリなど、このPDBがデバッグ情報を保持しているバイナリに寄与するファイル)に関する情報が含まれています。各モジュールには1つの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の値は、このモジュールがC11行情報ではなくC13行情報を持っていることを意味します。この結果として、C13行情報しか存在しないと予想され、C11行情報の形式は理解されていません。

  • シンボル - CodeViewシンボルサブストリームSymbolSizeは、モジュール情報サブストリームDBIストリームに対応するモジュールのエントリのSymByteSizeの値と等しくなります。

  • C11LineInfo - C11形式のCodeView行情報を含むブロック。C11Sizeは、モジュール情報サブストリームDBIストリームC11ByteSizeの値と等しくなります。この値が0の場合、C11行情報は存在しません。前述のように、C11行情報の形式は理解されておらず、最新のPDBのすべての行情報はC13形式であると仮定します。

  • C13LineInfo - C13形式のCodeView行情報を含むブロック。C13Sizeは、モジュール情報サブストリームDBIストリームC13ByteSizeの値と等しくなります。この値が0の場合、C13行情報は存在しません。

  • GlobalRefs - このサブストリームの意味は理解されていません。

CodeViewシンボルサブストリーム

CodeViewシンボルサブストリーム。これは、コンパイランドで定義された関数、変数、インライン情報、およびその他のシンボルを記述する可変長レコードの配列です。配列全体でSymbolSize-4バイトを消費します。CodeViewシンボルレコード(およびその結果、CodeViewシンボルレコードの配列)の形式については、CodeViewシンボルレコードを参照してください。