| ===================================== |
| 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`. |