|
1 | 1 | =====================================
|
2 | 2 | The Module Information Stream
|
3 | 3 | =====================================
|
| 4 | + |
| 5 | +.. contents:: |
| 6 | + :local: |
| 7 | + |
| 8 | +.. _modi_stream_intro: |
| 9 | + |
| 10 | +Introduction |
| 11 | +============ |
| 12 | + |
| 13 | +The Module Info Stream (henceforth referred to as the Modi stream) contains |
| 14 | +information about a single module (object file, import library, etc that |
| 15 | +contributes to the binary this PDB contains debug information about. There |
| 16 | +is one modi stream for each module, and the mapping between modi stream index |
| 17 | +and module is contained in the :doc:`DBI Stream <DbiStream>`. The modi stream |
| 18 | +for a single module contains line information for the compiland, as well as |
| 19 | +all CodeView information for the symbols defined in the compiland. Finally, |
| 20 | +there is a "global refs" substream which is not well understood. |
| 21 | + |
| 22 | +.. _modi_stream_layout: |
| 23 | + |
| 24 | +Stream Layout |
| 25 | +============= |
| 26 | + |
| 27 | +A modi stream is laid out as follows: |
| 28 | + |
| 29 | + |
| 30 | +.. code-block:: c++ |
| 31 | + |
| 32 | + struct ModiStream { |
| 33 | + uint32_t Signature; |
| 34 | + uint8_t Symbols[SymbolSize-4]; |
| 35 | + uint8_t C11LineInfo[C11Size]; |
| 36 | + uint8_t C13LineInfo[C13Size]; |
| 37 | + |
| 38 | + uint32_t GlobalRefsSize; |
| 39 | + uint8_t GlobalRefs[GlobalRefsSize]; |
| 40 | + }; |
| 41 | + |
| 42 | +- **Signature** - Unknown. In practice only the value of ``4`` has been |
| 43 | + observed. It is hypothesized that this value corresponds to the set of |
| 44 | + ``CV_SIGNATURE_xx`` defines in ``cvinfo.h``, with the value of ``4`` |
| 45 | + meaning that this module has C13 line information (as opposed to C11 line |
| 46 | + information). A corollary of this is that we expect to only ever see |
| 47 | + C13 line info, and that we do not understand the format of C11 line info. |
| 48 | + |
| 49 | +- **Symbols** - The :ref:`CodeView Symbol Substream <modi_symbol_substream>`. |
| 50 | + ``SymbolSize`` is equal to the value of ``SymByteSize`` for the |
| 51 | + corresponding module's entry in the :ref:`Module Info Substream <dbi_mod_info_substream>` |
| 52 | + of the :doc:`DBI Stream <DbiStream>`. |
| 53 | + |
| 54 | +- **C11LineInfo** - A block containing CodeView line information in C11 |
| 55 | + format. ``C11Size`` is equal to the value of ``C11ByteSize`` from the |
| 56 | + :ref:`Module Info Substream <dbi_mod_info_substream>` of the |
| 57 | + :doc:`DBI Stream <DbiStream>`. If this value is ``0``, then C11 line |
| 58 | + information is not present. As mentioned previously, the format of |
| 59 | + C11 line info is not understood and we assume all line in modern PDBs |
| 60 | + to be in C13 format. |
| 61 | + |
| 62 | +- **C13LineInfo** - A block containing CodeView line information in C13 |
| 63 | + format. ``C13Size`` is equal to the value of ``C13ByteSize`` from the |
| 64 | + :ref:`Module Info Substream <dbi_mod_info_substream>` of the |
| 65 | + :doc:`DBI Stream <DbiStream>`. If this value is ``0``, then C13 line |
| 66 | + information is not present. |
| 67 | + |
| 68 | +- **GlobalRefs** - The meaning of this substream is not understood. |
| 69 | + |
| 70 | +.. _modi_symbol_substream: |
| 71 | + |
| 72 | +The CodeView Symbol Substream |
| 73 | +============================= |
| 74 | + |
| 75 | +The CodeView Symbol Substream. This is an array of variable length |
| 76 | +records describing the functions, variables, inlining information, |
| 77 | +and other symbols defined in the compiland. The entire array consumes |
| 78 | +``SymbolSize-4`` bytes. The format of a CodeView Symbol Record (and |
| 79 | +thusly, an array of CodeView Symbol Records) is described in |
| 80 | +:doc:`CodeViewSymbols`. |
0 commit comments