|
|
1.1 root 1: /*** cvexefmt.h - format of CodeView information in exe
2: *
3: * Structures, constants, etc. for reading CodeView information
4: * from the executable.
5: *
6: */
7:
8:
9: /*** The master copy of this file resides in the CodeView project.
10: * All Microsoft projects are required to use the master copy without
11: * modification. Modification of the master version or a copy
12: * without consultation with all parties concerned is extremely
13: * risky.
14: *
15: */
16:
17:
18:
19:
20: // The following structures and constants describe the format of the
21: // CodeView Debug OMF for that will be accepted by CodeView 4.0 and
22: // later. These are executables with signatures of NB05, NB06 and NB07.
23: // There is some confusion about the signatures NB03 and NB04 so none
24: // of the utilites will accept executables with these signatures.
25:
26: // All of the structures described below must start on a long word boundary
27: // to maintain natural alignment. Pad space can be inserted during the
28: // write operation and the addresses adjusted without affecting the contents
29: // of the structures.
30:
31:
32: // Type of subsection entry.
33:
34: #define sstModule 0x120
35: #define sstTypes 0x121
36: #define sstPublic 0x122
37: #define sstPublicSym 0x123 // publics as symbol (waiting for link)
38: #define sstSymbols 0x124
39: #define sstAlignSym 0x125
40: #define sstSrcLnSeg 0x126 // because link doesn't emit SrcModule
41: #define sstSrcModule 0x127
42: #define sstLibraries 0x128
43: #define sstGlobalSym 0x129
44: #define sstGlobalPub 0x12a
45: #define sstGlobalTypes 0x12b
46: #define sstMPC 0x12c
47: #define sstSegMap 0x12d
48: #define sstSegName 0x12e
49: #define sstPreComp 0x12f // precompiled types
50: #define sstPreCompMap 0x130 // map precompiled types in global types
51: #define sstOffsetMap16 0x131
52: #define sstOffsetMap32 0x132
53: #define sstFileIndex 0x133
54: #define sstStaticSym 0x134
55:
56:
57:
58: typedef enum OMFHash {
59: OMFHASH_NONE, // no hashing
60: OMFHASH_SUMUC16, // upper case sum of chars in 16 bit table
61: OMFHASH_SUMUC32, // upper case sum of chars in 32 bit table
62: OMFHASH_ADDR16, // sorted by increasing address in 16 bit table
63: OMFHASH_ADDR32 // sorted by increasing address in 32 bit table
64: } OMFHASH;
65:
66: // CodeView Debug OMF signature. The signature at the end of the file is
67: // a negative offset from the end of the file to another signature. At
68: // the negative offset (base address) is another signature whose filepos
69: // field points to the first OMFDirHeader in a chain of directories.
70: // The NB05 signature is used by the link utility to indicated a completely
71: // unpacked file. The NB06 signature is used by ilink to indicate that the
72: // executable has had CodeView information from an incremental link appended
73: // to the executable. The NB07 signature is used by cvpack to indicate that
74: // the CodeView Debug OMF has been packed. CodeView will only process
75: // executables with the NB07 signature.
76:
77:
78: typedef struct OMFSignature {
79: char Signature[4]; // "NB05", "NB06" or "NB07"
80: long filepos; // offset in file
81: } OMFSignature;
82:
83:
84:
85: // directory information structure
86: // This structure contains the information describing the directory.
87: // It is pointed to by the signature at the base address or the directory
88: // link field of a preceeding directory. The directory entries immediately
89: // follow this structure.
90:
91:
92: typedef struct OMFDirHeader {
93: unsigned short cbDirHeader; // length of this structure
94: unsigned short cbDirEntry; // number of bytes in each directory entry
95: unsigned long cDir; // number of directorie entries
96: long lfoNextDir; // offset from base of next directory
97: unsigned long flags; // status flags
98: } OMFDirHeader;
99:
100:
101:
102:
103: // directory structure
104: // The data in this structure is used to reference the data for each
105: // subsection of the CodeView Debug OMF information. Tables that are
106: // not associated with a specific module will have a module index of
107: // oxffff. These tables are the global types table, the global symbol
108: // table, the global public table and the library table.
109:
110:
111: typedef struct OMFDirEntry {
112: unsigned short SubSection; // subsection type (sst...)
113: unsigned short iMod; // module index
114: long lfo; // large file offset of subsection
115: unsigned long cb; // number of bytes in subsection
116: } OMFDirEntry;
117:
118:
119:
120: // information decribing each segment in a module
121:
122: typedef struct OMFSegDesc {
123: unsigned short Seg; // segment index
124: unsigned short pad; // pad to maintain alignment
125: unsigned long Off; // offset of code in segment
126: unsigned long cbSeg; // number of bytes in segment
127: } OMFSegDesc;
128:
129:
130:
131:
132: // per module information
133: // There is one of these subsection entries for each module
134: // in the executable. The entry is generated by link/ilink.
135: // This table will probably require padding because of the
136: // variable length module name.
137:
138: typedef struct OMFModule {
139: unsigned short ovlNumber; // overlay number
140: unsigned short iLib; // library that the module was linked from
141: unsigned short cSeg; // count of number of segments in module
142: char Style[2]; // debugging style "CV"
143: OMFSegDesc SegInfo[1]; // describes segments in module
144: char Name[]; // length prefixed module name padded to
145: // long word boundary
146: } OMFModule;
147:
148:
149:
150: // Symbol hash table format
151: // This structure immediately preceeds the global publics table
152: // and global symbol tables.
153:
154: typedef struct OMFSymHash {
155: unsigned short symhash; // symbol hash function index
156: unsigned short addrhash; // address hash function index
157: unsigned long cbSymbol; // length of symbol information
158: unsigned long cbHSym; // length of symbol hash data
159: unsigned long cbHAddr; // length of address hashdata
160: } OMFSymHash;
161:
162:
163:
164: // Global types subsection format
165: // This structure immediately preceeds the global types table.
166: // The offsets in the typeOffset array are relative to the address
167: // of ctypes. Each type entry following the typeOffset array must
168: // begin on a long word boundary.
169:
170: typedef struct OMFTypeFlags {
171: unsigned long sig :8;
172: unsigned long unused :24;
173: } OMFTypeFlags;
174:
175:
176: typedef struct OMFGlobalTypes {
177: OMFTypeFlags flags;
178: unsigned long cTypes; // number of types
179: unsigned long typeOffset[]; // array of offsets to types
180: } OMFGlobalTypes;
181:
182:
183:
184:
185: // Precompiled types mapping table
186: // This table should be ignored by all consumers except the incremental
187: // packer.
188:
189:
190: typedef struct OMFPreCompMap {
191: unsigned short FirstType; // first precompiled type index
192: unsigned short cTypes; // number of precompiled types
193: unsigned long signature; // precompiled types signature
194: unsigned short pad;
195: CV_typ_t map[]; // mapping of precompiled types
196: } OMFPreCompMap;
197:
198:
199:
200:
201: // Source line to address mapping table.
202: // This table is generated by the link/ilink utility from line number
203: // information contained in the object file OMF data. This table contains
204: // only the code contribution for one segment from one source file.
205:
206:
207: typedef struct OMFSourceLine {
208: unsigned short Seg; // linker segment index
209: unsigned short cLnOff; // count of line/offset pairs
210: unsigned long offset[1]; // array of offsets in segment
211: unsigned short lineNbr[1]; // array of line lumber in source
212: } OMFSourceLine;
213:
214: typedef OMFSourceLine FAR * LPSL;
215:
216:
217: // Source file description
218: // This table is generated by the linker
219:
220:
221: typedef struct OMFSourceFile {
222: unsigned short cSeg; // number of segments from source file
223: unsigned short reserved; // reserved
224: unsigned long baseSrcLn[1]; // base of OMFSourceLine tables
225: // this array is followed by array
226: // of segment start/end pairs followed by
227: // an array of linker indices
228: // for each segment in the file
229: unsigned short cFName; // length of source file name
230: char Name; // name of file padded to long boundary
231: } OMFSourceFile;
232:
233: typedef OMFSourceFile FAR * LPSF;
234:
235:
236: // Source line to address mapping header structure
237: // This structure describes the number and location of the
238: // OMFAddrLine tables for a module. The offSrcLine entries are
239: // relative to the beginning of this structure.
240:
241:
242: typedef struct OMFSourceModule {
243: unsigned short cFile; // number of OMFSourceTables
244: unsigned short cSeg; // number of segments in module
245: unsigned long baseSrcFile[1]; // base of OMFSourceFile table
246: // this array is followed by array
247: // of segment start/end pairs followed
248: // by an array of linker indices
249: // for each segment in the module
250: } OMFSourceModule;
251:
252: typedef OMFSourceModule FAR * LPSM;
253:
254: // sstLibraries
255:
256: typedef struct OMFLibrary {
257: unsigned char cbLibs; // count of library names
258: char Libs[1]; // array of length prefixed lib names (first entry zero length)
259: } OMFLibrary;
260:
261:
262: // Pcode support. This subsection contains debug information generated
263: // by the MPC utility used to process Pcode executables. Currently
264: // it contains a mapping table from segment index (zero based) to
265: // frame paragraph. MPC converts segmented exe's to non-segmented
266: // exe's for DOS support. To avoid backpatching all CV info, this
267: // table is provided for the mapping. Additional info may be provided
268: // in the future for profiler support.
269:
270: typedef struct OMFMpcDebugInfo {
271: unsigned short cSeg; // number of segments in module
272: unsigned short mpSegFrame[1]; // map seg (zero based) to frame
273: } OMFMpcDebugInfo;
274:
275: // The following structures and constants describe the format of the
276: // CodeView Debug OMF for linkers that emit executables with the NB02
277: // signature. Current utilities with the exception of cvpack and cvdump
278: // will not accept or emit executables with the NB02 signature. Cvdump
279: // will dump an unpacked executable with the NB02 signature. Cvpack will
280: // read an executable with the NB02 signature but the packed executable
281: // will be written with the table format, contents and signature of NB07.
282:
283:
284:
285:
286:
287: // subsection type constants
288:
289: #define SSTMODULE 0x101 // Basic info. about object module
290: #define SSTPUBLIC 0x102 // Public symbols
291: #define SSTTYPES 0x103 // Type information
292: #define SSTSYMBOLS 0x104 // Symbol Data
293: #define SSTSRCLINES 0x105 // Source line information
294: #define SSTLIBRARIES 0x106 // Names of all library files used
295: #define SSTIMPORTS 0x107 // Symbols for DLL fixups
296: #define SSTCOMPACTED 0x108 // Compacted types section
297: #define SSTSRCLNSEG 0x109 // Same as source lines, contains segment
298:
299:
300: typedef struct DirEntry{
301: unsigned short SubSectionType;
302: unsigned short ModuleIndex;
303: long lfoStart;
304: unsigned short Size;
305: } DirEntry;
306:
307:
308: // information decribing each segment in a module
309:
310: typedef struct oldnsg {
311: unsigned short Seg; // segment index
312: unsigned short Off; // offset of code in segment
313: unsigned short cbSeg; // number of bytes in segment
314: } oldnsg;
315:
316:
317: // old subsection module information
318:
319: typedef struct oldsmd {
320: oldnsg SegInfo; // describes first segment in module
321: unsigned short ovlNbr; // overlay number
322: unsigned short iLib;
323: unsigned char cSeg; // Number of segments in module
324: char reserved;
325: unsigned char cbName[1]; // length prefixed name of module
326: oldnsg arnsg[]; // cSeg-1 structures exist for alloc text or comdat code
327: } oldsmd;
328:
329: typedef struct{
330: unsigned short Seg;
331: unsigned long Off;
332: unsigned long cbSeg;
333: } oldnsg32;
334:
335: typedef struct {
336: oldnsg32 SegInfo; // describes first segment in module
337: unsigned short ovlNbr; // overlay number
338: unsigned short iLib;
339: unsigned char cSeg; // Number of segments in module
340: char reserved;
341: unsigned char cbName[1]; // length prefixed name of module
342: oldnsg32 arnsg[]; // cSeg-1 structures exist for alloc text or comdat code
343: } oldsmd32;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.