===================================== | |
The Module Information Stream | |
===================================== | |
.. contents:: | |
:local: | |
.. _modi_stream_intro: | |
Introduction | |
============ | |
The Module Info Stream (henceforth referred to as the Modi stream) contains | |
information about a single module (object file, import library, etc that | |
contributes to the binary this PDB contains debug information about. There | |
is one modi stream for each module, and the mapping between modi stream index | |
and module is contained in the :doc:`DBI Stream <DbiStream>`. The modi stream | |
for a single module contains line information for the compiland, as well as | |
all CodeView information for the symbols defined in the compiland. Finally, | |
there is a "global refs" substream which is not well understood. | |
.. _modi_stream_layout: | |
Stream Layout | |
============= | |
A modi stream is laid out as follows: | |
.. code-block:: c++ | |
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** - Unknown. In practice only the value of ``4`` has been | |
observed. It is hypothesized that this value corresponds to the set of | |
``CV_SIGNATURE_xx`` defines in ``cvinfo.h``, with the value of ``4`` | |
meaning that this module has C13 line information (as opposed to C11 line | |
information). A corollary of this is that we expect to only ever see | |
C13 line info, and that we do not understand the format of C11 line info. | |
- **Symbols** - The :ref:`CodeView Symbol Substream <modi_symbol_substream>`. | |
``SymbolSize`` is equal to the value of ``SymByteSize`` for the | |
corresponding module's entry in the :ref:`Module Info Substream <dbi_mod_info_substream>` | |
of the :doc:`DBI Stream <DbiStream>`. | |
- **C11LineInfo** - A block containing CodeView line information in C11 | |
format. ``C11Size`` is equal to the value of ``C11ByteSize`` from the | |
:ref:`Module Info Substream <dbi_mod_info_substream>` of the | |
:doc:`DBI Stream <DbiStream>`. If this value is ``0``, then C11 line | |
information is not present. As mentioned previously, the format of | |
C11 line info is not understood and we assume all line in modern PDBs | |
to be in C13 format. | |
- **C13LineInfo** - A block containing CodeView line information in C13 | |
format. ``C13Size`` is equal to the value of ``C13ByteSize`` from the | |
:ref:`Module Info Substream <dbi_mod_info_substream>` of the | |
:doc:`DBI Stream <DbiStream>`. If this value is ``0``, then C13 line | |
information is not present. | |
- **GlobalRefs** - The meaning of this substream is not understood. | |
.. _modi_symbol_substream: | |
The CodeView Symbol Substream | |
============================= | |
The CodeView Symbol Substream. This is an array of variable length | |
records describing the functions, variables, inlining information, | |
and other symbols defined in the compiland. The entire array consumes | |
``SymbolSize-4`` bytes. The format of a CodeView Symbol Record (and | |
thusly, an array of CodeView Symbol Records) is described in | |
:doc:`CodeViewSymbols`. |