429 lines
14 KiB
C
429 lines
14 KiB
C
|
/*** cvexefmt.h - format of CodeView information in exe
|
||
|
*
|
||
|
* Structures, constants, etc. for reading CodeView information
|
||
|
* from the executable.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
|
||
|
/*** The master copy of this file resides in the LANGAPI project.
|
||
|
* All Microsoft projects are required to use the master copy without
|
||
|
* modification. Modification of the master version or a copy
|
||
|
* without consultation with all parties concerned is extremely
|
||
|
* risky.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
// The following structures and constants describe the format of the
|
||
|
// CodeView Debug OMF for that will be accepted by CodeView 4.0 and
|
||
|
// later. These are executables with signatures of NB05, NB06 and NB08.
|
||
|
// There is some confusion about the signatures NB03 and NB04 so none
|
||
|
// of the utilites will accept executables with these signatures. NB07 is
|
||
|
// the signature for QCWIN 1.0 packed executables.
|
||
|
|
||
|
// All of the structures described below must start on a long word boundary
|
||
|
// to maintain natural alignment. Pad space can be inserted during the
|
||
|
// write operation and the addresses adjusted without affecting the contents
|
||
|
// of the structures.
|
||
|
|
||
|
|
||
|
#ifndef _CV_INFO_INCLUDED
|
||
|
#include "cvinfo.h"
|
||
|
#endif
|
||
|
|
||
|
#pragma warning(disable:4200) // zero sized array
|
||
|
|
||
|
#ifndef FAR
|
||
|
#if _M_IX86 >= 300
|
||
|
#define FAR
|
||
|
#else
|
||
|
#define FAR far
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
|
||
|
// Type of subsection entry.
|
||
|
|
||
|
#define sstModule 0x120
|
||
|
#define sstTypes 0x121
|
||
|
#define sstPublic 0x122
|
||
|
#define sstPublicSym 0x123 // publics as symbol (waiting for link)
|
||
|
#define sstSymbols 0x124
|
||
|
#define sstAlignSym 0x125
|
||
|
#define sstSrcLnSeg 0x126 // because link doesn't emit SrcModule
|
||
|
#define sstSrcModule 0x127
|
||
|
#define sstLibraries 0x128
|
||
|
#define sstGlobalSym 0x129
|
||
|
#define sstGlobalPub 0x12a
|
||
|
#define sstGlobalTypes 0x12b
|
||
|
#define sstMPC 0x12c
|
||
|
#define sstSegMap 0x12d
|
||
|
#define sstSegName 0x12e
|
||
|
#define sstPreComp 0x12f // precompiled types
|
||
|
#define sstPreCompMap 0x130 // map precompiled types in global types
|
||
|
#define sstOffsetMap16 0x131
|
||
|
#define sstOffsetMap32 0x132
|
||
|
#define sstFileIndex 0x133 // Index of file names
|
||
|
#define sstStaticSym 0x134
|
||
|
|
||
|
typedef enum OMFHash {
|
||
|
OMFHASH_NONE, // no hashing
|
||
|
OMFHASH_SUMUC16, // upper case sum of chars in 16 bit table
|
||
|
OMFHASH_SUMUC32, // upper case sum of chars in 32 bit table
|
||
|
OMFHASH_ADDR16, // sorted by increasing address in 16 bit table
|
||
|
OMFHASH_ADDR32 // sorted by increasing address in 32 bit table
|
||
|
} OMFHASH;
|
||
|
|
||
|
// CodeView Debug OMF signature. The signature at the end of the file is
|
||
|
// a negative offset from the end of the file to another signature. At
|
||
|
// the negative offset (base address) is another signature whose filepos
|
||
|
// field points to the first OMFDirHeader in a chain of directories.
|
||
|
// The NB05 signature is used by the link utility to indicated a completely
|
||
|
// unpacked file. The NB06 signature is used by ilink to indicate that the
|
||
|
// executable has had CodeView information from an incremental link appended
|
||
|
// to the executable. The NB08 signature is used by cvpack to indicate that
|
||
|
// the CodeView Debug OMF has been packed. CodeView will only process
|
||
|
// executables with the NB08 signature.
|
||
|
|
||
|
|
||
|
typedef struct OMFSignature {
|
||
|
char Signature[4]; // "NBxx"
|
||
|
long filepos; // offset in file
|
||
|
} OMFSignature;
|
||
|
|
||
|
|
||
|
|
||
|
// directory information structure
|
||
|
// This structure contains the information describing the directory.
|
||
|
// It is pointed to by the signature at the base address or the directory
|
||
|
// link field of a preceeding directory. The directory entries immediately
|
||
|
// follow this structure.
|
||
|
|
||
|
|
||
|
typedef struct OMFDirHeader {
|
||
|
unsigned short cbDirHeader; // length of this structure
|
||
|
unsigned short cbDirEntry; // number of bytes in each directory entry
|
||
|
unsigned long cDir; // number of directorie entries
|
||
|
long lfoNextDir; // offset from base of next directory
|
||
|
unsigned long flags; // status flags
|
||
|
} OMFDirHeader;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
// directory structure
|
||
|
// The data in this structure is used to reference the data for each
|
||
|
// subsection of the CodeView Debug OMF information. Tables that are
|
||
|
// not associated with a specific module will have a module index of
|
||
|
// oxffff. These tables are the global types table, the global symbol
|
||
|
// table, the global public table and the library table.
|
||
|
|
||
|
|
||
|
typedef struct OMFDirEntry {
|
||
|
unsigned short SubSection; // subsection type (sst...)
|
||
|
unsigned short iMod; // module index
|
||
|
long lfo; // large file offset of subsection
|
||
|
unsigned long cb; // number of bytes in subsection
|
||
|
} OMFDirEntry;
|
||
|
|
||
|
|
||
|
|
||
|
// information decribing each segment in a module
|
||
|
|
||
|
typedef struct OMFSegDesc {
|
||
|
unsigned short Seg; // segment index
|
||
|
unsigned short pad; // pad to maintain alignment
|
||
|
unsigned long Off; // offset of code in segment
|
||
|
unsigned long cbSeg; // number of bytes in segment
|
||
|
} OMFSegDesc;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
// per module information
|
||
|
// There is one of these subsection entries for each module
|
||
|
// in the executable. The entry is generated by link/ilink.
|
||
|
// This table will probably require padding because of the
|
||
|
// variable length module name.
|
||
|
|
||
|
typedef struct OMFModule {
|
||
|
unsigned short ovlNumber; // overlay number
|
||
|
unsigned short iLib; // library that the module was linked from
|
||
|
unsigned short cSeg; // count of number of segments in module
|
||
|
char Style[2]; // debugging style "CV"
|
||
|
OMFSegDesc SegInfo[1]; // describes segments in module
|
||
|
char Name[]; // length prefixed module name padded to
|
||
|
// long word boundary
|
||
|
} OMFModule;
|
||
|
|
||
|
|
||
|
|
||
|
// Symbol hash table format
|
||
|
// This structure immediately preceeds the global publics table
|
||
|
// and global symbol tables.
|
||
|
|
||
|
typedef struct OMFSymHash {
|
||
|
unsigned short symhash; // symbol hash function index
|
||
|
unsigned short addrhash; // address hash function index
|
||
|
unsigned long cbSymbol; // length of symbol information
|
||
|
unsigned long cbHSym; // length of symbol hash data
|
||
|
unsigned long cbHAddr; // length of address hashdata
|
||
|
} OMFSymHash;
|
||
|
|
||
|
|
||
|
|
||
|
// Global types subsection format
|
||
|
// This structure immediately preceeds the global types table.
|
||
|
// The offsets in the typeOffset array are relative to the address
|
||
|
// of ctypes. Each type entry following the typeOffset array must
|
||
|
// begin on a long word boundary.
|
||
|
|
||
|
typedef struct OMFTypeFlags {
|
||
|
unsigned long sig :8;
|
||
|
unsigned long unused :24;
|
||
|
} OMFTypeFlags;
|
||
|
|
||
|
|
||
|
typedef struct OMFGlobalTypes {
|
||
|
OMFTypeFlags flags;
|
||
|
unsigned long cTypes; // number of types
|
||
|
unsigned long typeOffset[]; // array of offsets to types
|
||
|
} OMFGlobalTypes;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
// Precompiled types mapping table
|
||
|
// This table should be ignored by all consumers except the incremental
|
||
|
// packer.
|
||
|
|
||
|
|
||
|
typedef struct OMFPreCompMap {
|
||
|
unsigned short FirstType; // first precompiled type index
|
||
|
unsigned short cTypes; // number of precompiled types
|
||
|
unsigned long signature; // precompiled types signature
|
||
|
unsigned short pad;
|
||
|
CV_typ_t map[]; // mapping of precompiled types
|
||
|
} OMFPreCompMap;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
// Source line to address mapping table.
|
||
|
// This table is generated by the link/ilink utility from line number
|
||
|
// information contained in the object file OMF data. This table contains
|
||
|
// only the code contribution for one segment from one source file.
|
||
|
|
||
|
|
||
|
typedef struct OMFSourceLine {
|
||
|
unsigned short Seg; // linker segment index
|
||
|
unsigned short cLnOff; // count of line/offset pairs
|
||
|
unsigned long offset[1]; // array of offsets in segment
|
||
|
unsigned short lineNbr[1]; // array of line lumber in source
|
||
|
} OMFSourceLine;
|
||
|
|
||
|
typedef OMFSourceLine FAR * LPSL;
|
||
|
|
||
|
|
||
|
// Source file description
|
||
|
// This table is generated by the linker
|
||
|
|
||
|
|
||
|
typedef struct OMFSourceFile {
|
||
|
unsigned short cSeg; // number of segments from source file
|
||
|
unsigned short reserved; // reserved
|
||
|
unsigned long baseSrcLn[1]; // base of OMFSourceLine tables
|
||
|
// this array is followed by array
|
||
|
// of segment start/end pairs followed by
|
||
|
// an array of linker indices
|
||
|
// for each segment in the file
|
||
|
unsigned short cFName; // length of source file name
|
||
|
char Name; // name of file padded to long boundary
|
||
|
} OMFSourceFile;
|
||
|
|
||
|
typedef OMFSourceFile FAR * LPSF;
|
||
|
|
||
|
|
||
|
// Source line to address mapping header structure
|
||
|
// This structure describes the number and location of the
|
||
|
// OMFAddrLine tables for a module. The offSrcLine entries are
|
||
|
// relative to the beginning of this structure.
|
||
|
|
||
|
|
||
|
typedef struct OMFSourceModule {
|
||
|
unsigned short cFile; // number of OMFSourceTables
|
||
|
unsigned short cSeg; // number of segments in module
|
||
|
unsigned long baseSrcFile[1]; // base of OMFSourceFile table
|
||
|
// this array is followed by array
|
||
|
// of segment start/end pairs followed
|
||
|
// by an array of linker indices
|
||
|
// for each segment in the module
|
||
|
} OMFSourceModule;
|
||
|
|
||
|
typedef OMFSourceModule FAR * LPSM;
|
||
|
|
||
|
// sstLibraries
|
||
|
|
||
|
typedef struct OMFLibrary {
|
||
|
unsigned char cbLibs; // count of library names
|
||
|
char Libs[1]; // array of length prefixed lib names (first entry zero length)
|
||
|
} OMFLibrary;
|
||
|
|
||
|
|
||
|
// sstFileIndex - An index of all of the files contributing to an
|
||
|
// executable.
|
||
|
|
||
|
typedef struct OMFFileIndex {
|
||
|
unsigned short cmodules; // Number of modules
|
||
|
unsigned short cfilerefs; // Number of file references
|
||
|
unsigned short modulelist[1]; // Index to beginning of list of files
|
||
|
// for module i. (0 for module w/o files)
|
||
|
unsigned short cfiles[1]; // Number of file names associated
|
||
|
// with module i.
|
||
|
unsigned long ulNames[1]; // Offsets from the beginning of this
|
||
|
// table to the file names
|
||
|
char Names[]; // The length prefixed names of files
|
||
|
} OMFFileIndex;
|
||
|
|
||
|
|
||
|
// Offset mapping table
|
||
|
// This table provides a mapping from logical to physical offsets.
|
||
|
// This mapping is applied between the logical to physical mapping
|
||
|
// described by the seg map table.
|
||
|
|
||
|
typedef struct OMFOffsetMap16 {
|
||
|
unsigned long csegment; // Count of physical segments
|
||
|
|
||
|
// The next six items are repeated for each segment
|
||
|
|
||
|
unsigned long crangeLog; // Count of logical offset ranges
|
||
|
unsigned short rgoffLog[1]; // Array of logical offsets
|
||
|
short rgbiasLog[1]; // Array of logical->physical bias
|
||
|
unsigned long crangePhys; // Count of physical offset ranges
|
||
|
unsigned short rgoffPhys[1]; // Array of physical offsets
|
||
|
short rgbiasPhys[1]; // Array of physical->logical bias
|
||
|
} OMFOffsetMap16;
|
||
|
|
||
|
typedef struct OMFOffsetMap32 {
|
||
|
unsigned long csection; // Count of physical sections
|
||
|
|
||
|
// The next six items are repeated for each section
|
||
|
|
||
|
unsigned long crangeLog; // Count of logical offset ranges
|
||
|
unsigned long rgoffLog[1]; // Array of logical offsets
|
||
|
long rgbiasLog[1]; // Array of logical->physical bias
|
||
|
unsigned long crangePhys; // Count of physical offset ranges
|
||
|
unsigned long rgoffPhys[1]; // Array of physical offsets
|
||
|
long rgbiasPhys[1]; // Array of physical->logical bias
|
||
|
} OMFOffsetMap32;
|
||
|
|
||
|
// Pcode support. This subsection contains debug information generated
|
||
|
// by the MPC utility used to process Pcode executables. Currently
|
||
|
// it contains a mapping table from segment index (zero based) to
|
||
|
// frame paragraph. MPC converts segmented exe's to non-segmented
|
||
|
// exe's for DOS support. To avoid backpatching all CV info, this
|
||
|
// table is provided for the mapping. Additional info may be provided
|
||
|
// in the future for profiler support.
|
||
|
|
||
|
typedef struct OMFMpcDebugInfo {
|
||
|
unsigned short cSeg; // number of segments in module
|
||
|
unsigned short mpSegFrame[1]; // map seg (zero based) to frame
|
||
|
} OMFMpcDebugInfo;
|
||
|
|
||
|
// The following structures and constants describe the format of the
|
||
|
// CodeView Debug OMF for linkers that emit executables with the NB02
|
||
|
// signature. Current utilities with the exception of cvpack and cvdump
|
||
|
// will not accept or emit executables with the NB02 signature. Cvdump
|
||
|
// will dump an unpacked executable with the NB02 signature. Cvpack will
|
||
|
// read an executable with the NB02 signature but the packed executable
|
||
|
// will be written with the table format, contents and signature of NB08.
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
// subsection type constants
|
||
|
|
||
|
#define SSTMODULE 0x101 // Basic info. about object module
|
||
|
#define SSTPUBLIC 0x102 // Public symbols
|
||
|
#define SSTTYPES 0x103 // Type information
|
||
|
#define SSTSYMBOLS 0x104 // Symbol Data
|
||
|
#define SSTSRCLINES 0x105 // Source line information
|
||
|
#define SSTLIBRARIES 0x106 // Names of all library files used
|
||
|
#define SSTIMPORTS 0x107 // Symbols for DLL fixups
|
||
|
#define SSTCOMPACTED 0x108 // Compacted types section
|
||
|
#define SSTSRCLNSEG 0x109 // Same as source lines, contains segment
|
||
|
|
||
|
|
||
|
typedef struct DirEntry{
|
||
|
unsigned short SubSectionType;
|
||
|
unsigned short ModuleIndex;
|
||
|
long lfoStart;
|
||
|
unsigned short Size;
|
||
|
} DirEntry;
|
||
|
|
||
|
|
||
|
// information decribing each segment in a module
|
||
|
|
||
|
typedef struct oldnsg {
|
||
|
unsigned short Seg; // segment index
|
||
|
unsigned short Off; // offset of code in segment
|
||
|
unsigned short cbSeg; // number of bytes in segment
|
||
|
} oldnsg;
|
||
|
|
||
|
|
||
|
// old subsection module information
|
||
|
|
||
|
typedef struct oldsmd {
|
||
|
oldnsg SegInfo; // describes first segment in module
|
||
|
unsigned short ovlNbr; // overlay number
|
||
|
unsigned short iLib;
|
||
|
unsigned char cSeg; // Number of segments in module
|
||
|
char reserved;
|
||
|
unsigned char cbName[1]; // length prefixed name of module
|
||
|
oldnsg arnsg[]; // cSeg-1 structures exist for alloc text or comdat code
|
||
|
} oldsmd;
|
||
|
|
||
|
typedef struct{
|
||
|
unsigned short Seg;
|
||
|
unsigned long Off;
|
||
|
unsigned long cbSeg;
|
||
|
} oldnsg32;
|
||
|
|
||
|
typedef struct {
|
||
|
oldnsg32 SegInfo; // describes first segment in module
|
||
|
unsigned short ovlNbr; // overlay number
|
||
|
unsigned short iLib;
|
||
|
unsigned char cSeg; // Number of segments in module
|
||
|
char reserved;
|
||
|
unsigned char cbName[1]; // length prefixed name of module
|
||
|
oldnsg32 arnsg[]; // cSeg-1 structures exist for alloc text or comdat code
|
||
|
} oldsmd32;
|
||
|
|
||
|
|
||
|
// OMFSegMap - This table contains the mapping between the logical segment indices
|
||
|
// used in the symbol table and the physical segments where the program is loaded
|
||
|
|
||
|
typedef struct OMFSegMapDesc {
|
||
|
unsigned short flags; // descriptor flags bit field.
|
||
|
unsigned short ovl; // the logical overlay number
|
||
|
unsigned short group; // group index into the descriptor array
|
||
|
unsigned short frame; // logical segment index - interpreted via flags
|
||
|
unsigned short iSegName; // segment or group name - index into sstSegName
|
||
|
unsigned short iClassName; // class name - index into sstSegName
|
||
|
unsigned long offset; // byte offset of the logical within the physical segment
|
||
|
unsigned long cbSeg; // byte count of the logical segment or group
|
||
|
} OMFSegMapDesc;
|
||
|
|
||
|
typedef struct OMFSegMap {
|
||
|
unsigned short cSeg; // total number of segment descriptors
|
||
|
unsigned short cSegLog; // number of logical segment descriptors
|
||
|
OMFSegMapDesc rgDesc[0]; // array of segment descriptors
|
||
|
} OMFSegMap;
|
||
|
|
||
|
#pragma warning(default:4200) // zero sized array
|
||
|
|