模块信息流

简介

模块信息流(以下简称 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 符号记录中进行了描述。