模块信息流¶
简介¶
模块信息流(以下简称 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];
};
签名 (Signature) - 未知。在实践中,仅观察到值
4
。据推测,此值对应于cvinfo.h
中CV_SIGNATURE_xx
定义的集合,其中值4
表示此模块具有 C13 行信息(而不是 C11 行信息)。由此推论,我们期望只看到 C13 行信息,并且我们不了解 C11 行信息的格式。符号 (Symbols) - 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 符号记录 中进行了描述。