2019-05-02 03:15:05 +08:00
|
|
|
=====================================
|
|
|
|
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];
|
2019-06-22 19:23:01 +08:00
|
|
|
|
2019-05-02 03:15:05 +08:00
|
|
|
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.
|
2019-06-22 19:23:01 +08:00
|
|
|
|
2019-05-02 03:15:05 +08:00
|
|
|
- **Symbols** - The :ref:`CodeView Symbol Substream <modi_symbol_substream>`.
|
|
|
|
``SymbolSize`` is equal to the value of ``SymByteSize`` for the
|
2019-06-22 19:23:01 +08:00
|
|
|
corresponding module's entry in the :ref:`Module Info Substream
|
|
|
|
<dbi_mod_info_substream>` of the :doc:`DBI Stream <DbiStream>`.
|
2019-05-02 03:15:05 +08:00
|
|
|
|
|
|
|
- **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.
|
2019-06-22 19:23:01 +08:00
|
|
|
|
2019-05-02 03:15:05 +08:00
|
|
|
- **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.
|
2019-06-22 19:23:01 +08:00
|
|
|
|
2019-05-02 03:15:05 +08:00
|
|
|
- **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`.
|