VirtualBox

source: vbox/trunk/include/iprt/formats/codeview.h@ 66689

Last change on this file since 66689 was 62474, checked in by vboxsync, 8 years ago

(C) 2016

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 26.6 KB
Line 
1/** @file
2 * IPRT - Microsoft CodeView Debug Information.
3 */
4
5/*
6 * Copyright (C) 2009-2016 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef ___iprt_formats_codeview_h
27#define ___iprt_formats_codeview_h
28
29
30#include <iprt/types.h>
31#include <iprt/assert.h>
32
33
34/** @defgroup grp_rt_fmt_codeview Microsoft CodeView Debug Information
35 * @{
36 */
37
38
39/**
40 * CodeView Header. There are two of this, base header at the start of the debug
41 * information and a trailing header at the end.
42 */
43typedef struct RTCVHDR
44{
45 /** The magic ('NBxx'), see RTCVHDR_MAGIC_XXX. */
46 uint32_t u32Magic;
47 /**
48 * Base header: Subsection directory offset relative to this header (start).
49 * Trailing header: Offset of the base header relative to the end of the file.
50 *
51 * Called lfoBase, lfaBase, lfoDirectory, lfoDir and probably other things in
52 * the various specs/docs available. */
53 uint32_t off;
54} RTCVHDR;
55/** Pointer to a CodeView header. */
56typedef RTCVHDR *PRTCVHDR;
57
58/** @name CodeView magic values (RTCVHDR::u32Magic).
59 * @{ */
60/** CodeView from Visual C++ 5.0. Specified in the 2001 MSDN specs.chm file. */
61#define RTCVHDR_MAGIC_NB11 RT_MAKE_U32_FROM_U8('N', 'B', '1', '1')
62/** External PDB reference (often referred to as PDB 2.0). */
63#define RTCVHDR_MAGIC_NB10 RT_MAKE_U32_FROM_U8('N', 'B', '1', '0')
64/** CodeView v4.10, packed. Specified in the TIS document. */
65#define RTCVHDR_MAGIC_NB09 RT_MAKE_U32_FROM_U8('N', 'B', '0', '9')
66/** CodeView v4.00 thru v4.05. Specified in the TIS document? */
67#define RTCVHDR_MAGIC_NB08 RT_MAKE_U32_FROM_U8('N', 'B', '0', '8')
68/** Quick C for Windows 1.0 debug info. */
69#define RTCVHDR_MAGIC_NB07 RT_MAKE_U32_FROM_U8('N', 'B', '0', '7')
70/** Emitted by ILINK indicating incremental link. Comparable to NB05? */
71#define RTCVHDR_MAGIC_NB06 RT_MAKE_U32_FROM_U8('N', 'B', '0', '6')
72/** Emitted by LINK version 5.20 and later before packing. */
73#define RTCVHDR_MAGIC_NB05 RT_MAKE_U32_FROM_U8('N', 'B', '0', '5')
74/** Emitted by IBM ILINK for HLL (similar to NB02 in many ways). */
75#define RTCVHDR_MAGIC_NB04 RT_MAKE_U32_FROM_U8('N', 'B', '0', '4')
76/** Emitted by LINK version 5.10 (or similar OMF linkers), as shipped with
77 * Microsoft C v6.0 for example. More or less entirely 16-bit. */
78#define RTCVHDR_MAGIC_NB02 RT_MAKE_U32_FROM_U8('N', 'B', '0', '2')
79/* No idea what NB03 might have been. */
80/** AIX debugger format according to "IBM OS/2 16/32-bit Object Module Format
81 * (OMF) and Linear eXecutable Module Format (LX)" revision 10 (LXOMF.PDF). */
82#define RTCVHDR_MAGIC_NB01 RT_MAKE_U32_FROM_U8('N', 'B', '0', '1')
83/** Ancient CodeView format according to LXOMF.PDF. */
84#define RTCVHDR_MAGIC_NB00 RT_MAKE_U32_FROM_U8('N', 'B', '0', '0')
85/** @} */
86
87
88/** @name CV directory headers.
89 * @{ */
90
91/**
92 * Really old CV directory header used with NB00 and NB02.
93 *
94 * Uses 16-bit directory entires (RTCVDIRENT16).
95 */
96typedef struct RTCVDIRHDR16
97{
98 /** The number of directory entries. */
99 uint16_t cEntries;
100} RTCVDIRHDR16;
101/** Pointer to a old CV directory header. */
102typedef RTCVDIRHDR16 *PRTCVDIRHDR16;
103
104/**
105 * Simple 32-bit CV directory base header, used by NB04 (aka IBM HLL).
106 */
107typedef struct RTCVDIRHDR32
108{
109 /** The number of bytes of this header structure. */
110 uint16_t cbHdr;
111 /** The number of bytes per entry. */
112 uint16_t cbEntry;
113 /** The number of directory entries. */
114 uint32_t cEntries;
115} RTCVDIRHDR32;
116/** Pointer to a 32-bit CV directory header. */
117typedef RTCVDIRHDR32 *PRTCVDIRHDR32;
118
119/**
120 * Extended 32-bit CV directory header as specified in the TIS doc.
121 * The two extra fields seems to never have been assigned any official purpose.
122 */
123typedef struct RTCVDIRHDR32EX
124{
125 /** This starts the same way as the NB04 header. */
126 RTCVDIRHDR32 Core;
127 /** Tentatively decleared as the offset to the next directory generated by
128 * the incremental linker. Haven't seen this used yet. */
129 uint32_t offNextDir;
130 /** Flags, non defined apparently, so MBZ. */
131 uint32_t fFlags;
132} RTCVDIRHDR32EX;
133/** Pointer to an extended 32-bit CV directory header. */
134typedef RTCVDIRHDR32EX *PRTCVDIRHDR32EX;
135
136/** @} */
137
138
139/**
140 * 16-bit CV directory entry used with NB00 and NB02.
141 */
142typedef struct RTCVDIRENT16
143{
144 /** Subsection type (RTCVSST). */
145 uint16_t uSubSectType;
146 /** Which module (1-based, 0xffff is special). */
147 uint16_t iMod;
148 /** The lowe offset of this subsection relative to the base CV header. */
149 uint16_t offLow;
150 /** The high part of the subsection offset. */
151 uint16_t offHigh;
152 /** The size of the subsection. */
153 uint16_t cb;
154} RTCVDIRENT16;
155AssertCompileSize(RTCVDIRENT16, 10);
156/** Pointer to a 16-bit CV directory entry. */
157typedef RTCVDIRENT16 *PRTCVDIRENT16;
158
159
160/**
161 * 32-bit CV directory entry used starting with NB04.
162 */
163typedef struct RTCVDIRENT32
164{
165 /** Subsection type (RTCVSST). */
166 uint16_t uSubSectType;
167 /** Which module (1-based, 0xffff is special). */
168 uint16_t iMod;
169 /** The offset of this subsection relative to the base CV header. */
170 uint32_t off;
171 /** The size of the subsection. */
172 uint32_t cb;
173} RTCVDIRENT32;
174AssertCompileSize(RTCVDIRENT32, 12);
175/** Pointer to a 32-bit CV directory entry. */
176typedef RTCVDIRENT32 *PRTCVDIRENT32;
177/** Pointer to a const 32-bit CV directory entry. */
178typedef RTCVDIRENT32 const *PCRTCVDIRENT32;
179
180
181/**
182 * CodeView subsection types.
183 */
184typedef enum RTCVSST
185{
186 /** @name NB00, NB02 and NB04 subsection types.
187 * The actual format of each subsection varies between NB04 and the others,
188 * and it may further vary in NB04 depending on the module type.
189 * @{ */
190 kCvSst_OldModule = 0x101,
191 kCvSst_OldPublic,
192 kCvSst_OldTypes,
193 kCvSst_OldSymbols,
194 kCvSst_OldSrcLines,
195 kCvSst_OldLibraries,
196 kCvSst_OldImports,
197 kCvSst_OldCompacted,
198 kCvSst_OldSrcLnSeg = 0x109,
199 kCvSst_OldSrcLines3 = 0x10b,
200 /** @} */
201
202 /** @name NB09, NB11 (and possibly NB05, NB06, NB07, and NB08) subsection types.
203 * @{ */
204 kCvSst_Module = 0x120,
205 kCvSst_Types,
206 kCvSst_Public,
207 kCvSst_PublicSym,
208 kCvSst_Symbols,
209 kCvSst_AlignSym,
210 kCvSst_SrcLnSeg,
211 kCvSst_SrcModule,
212 kCvSst_Libraries,
213 kCvSst_GlobalSym,
214 kCvSst_GlobalPub,
215 kCvSst_GlobalTypes,
216 kCvSst_MPC,
217 kCvSst_SegMap,
218 kCvSst_SegName,
219 kCvSst_PreComp,
220 kCvSst_PreCompMap,
221 kCvSst_OffsetMap16,
222 kCvSst_OffsetMap32,
223 kCvSst_FileIndex = 0x133,
224 kCvSst_StaticSym
225 /** @} */
226} RTCVSST;
227/** Pointer to a CV subsection type value. */
228typedef RTCVSST *PRTCVSST;
229/** Pointer to a const CV subsection type value. */
230typedef RTCVSST const *PCRTCVSST;
231
232
233/**
234 * CV4 module segment info.
235 */
236typedef struct RTCVMODSEGINFO32
237{
238 /** The segment number. */
239 uint16_t iSeg;
240 /** Explicit padding. */
241 uint16_t u16Padding;
242 /** Offset into the segment. */
243 uint32_t off;
244 /** The size of the contribution. */
245 uint32_t cb;
246} RTCVMODSEGINFO32;
247typedef RTCVMODSEGINFO32 *PRTCVMODSEGINFO32;
248typedef RTCVMODSEGINFO32 const *PCRTCVMODSEGINFO32;
249
250
251/**
252 * CV4 segment map header.
253 */
254typedef struct RTCVSEGMAPHDR
255{
256 /** Number of segments descriptors in the table. */
257 uint16_t cSegs;
258 /** Number of logical segment descriptors. */
259 uint16_t cLogSegs;
260} RTCVSEGMAPHDR;
261/** Pointer to a CV4 segment map header. */
262typedef RTCVSEGMAPHDR *PRTCVSEGMAPHDR;
263/** Pointer to a const CV4 segment map header. */
264typedef RTCVSEGMAPHDR const *PCRTCVSEGMAPHDR;
265
266/**
267 * CV4 Segment map descriptor entry.
268 */
269typedef struct RTCVSEGMAPDESC
270{
271 /** Segment flags. */
272 uint16_t fFlags;
273 /** The overlay number. */
274 uint16_t iOverlay;
275 /** Group index into this segment descriptor array. 0 if not relevant.
276 * The group descriptors are found in the second half of the table. */
277 uint16_t iGroup;
278 /** Complicated. */
279 uint16_t iFrame;
280 /** Offset (byte) into the kCvSst_SegName table of the segment name, or
281 * 0xffff. */
282 uint16_t offSegName;
283 /** Offset (byte) into the kCvSst_SegName table of the class name, or 0xffff. */
284 uint16_t offClassName;
285 /** Offset into the physical segment. */
286 uint32_t off;
287 /** Size of segment. */
288 uint32_t cb;
289} RTCVSEGMAPDESC;
290/** Pointer to a segment map descriptor entry. */
291typedef RTCVSEGMAPDESC *PRTCVSEGMAPDESC;
292/** Pointer to a const segment map descriptor entry. */
293typedef RTCVSEGMAPDESC const *PCRTCVSEGMAPDESC;
294
295/** @name RTCVSEGMAPDESC_F_XXX - RTCVSEGMAPDESC::fFlags values.
296 * @{ */
297#define RTCVSEGMAPDESC_F_READ UINT16_C(0x0001)
298#define RTCVSEGMAPDESC_F_WRITE UINT16_C(0x0002)
299#define RTCVSEGMAPDESC_F_EXECUTE UINT16_C(0x0004)
300#define RTCVSEGMAPDESC_F_32BIT UINT16_C(0x0008)
301#define RTCVSEGMAPDESC_F_SEL UINT16_C(0x0100)
302#define RTCVSEGMAPDESC_F_ABS UINT16_C(0x0200)
303#define RTCVSEGMAPDESC_F_GROUP UINT16_C(0x1000)
304#define RTCVSEGMAPDESC_F_RESERVED UINT16_C(0xecf0)
305/** @} */
306
307/**
308 * CV4 segment map subsection.
309 */
310typedef struct RTCVSEGMAP
311{
312 /** The header. */
313 RTCVSEGMAPHDR Hdr;
314 /** Descriptor array. */
315 RTCVSEGMAPDESC aDescs[1];
316} RTCVSEGMAP;
317/** Pointer to a segment map subsection. */
318typedef RTCVSEGMAP *PRTCVSEGMAP;
319/** Pointer to a const segment map subsection. */
320typedef RTCVSEGMAP const *PCRTCVSEGMAP;
321
322
323/**
324 * CV4 line number segment contribution start/end table entry.
325 * Part of RTCVSRCMODULE.
326 */
327typedef struct RTCVSRCRANGE
328{
329 /** Start segment offset. */
330 uint32_t offStart;
331 /** End segment offset (inclusive?). */
332 uint32_t offEnd;
333} RTCVSRCRANGE;
334/** Pointer to a line number segment contributation. */
335typedef RTCVSRCRANGE *PRTCVSRCRANGE;
336/** Pointer to a const line number segment contributation. */
337typedef RTCVSRCRANGE const *PCRTCVSRCRANGE;
338
339/**
340 * CV4 header for a line number subsection, used by kCvSst_SrcModule.
341 *
342 * The aoffSrcFiles member is followed by an array of segment ranges
343 * (RTCVSRCRANGE), cSegs in length. This may contain zero entries if the
344 * information is not known or not possible to express in this manner.
345 *
346 * After the range table, a segment index (uint16_t) mapping table follows, also
347 * cSegs in length.
348 */
349typedef struct RTCVSRCMODULE
350{
351 /** The number of files described in this subsection. */
352 uint16_t cFiles;
353 /** The number of code segments this module contributes to. */
354 uint16_t cSegs;
355 /** Offsets of the RTCVSRCFILE entries in this subsection, length given by
356 * the above cFiles member. */
357 uint32_t aoffSrcFiles[1 /*cFiles*/];
358 /* RTCVSRCRANGE aSegRanges[cSegs]; */
359 /* uint16_t aidxSegs[cSegs]; */
360} RTCVSRCMODULE;
361/** Pointer to a source module subsection header. */
362typedef RTCVSRCMODULE *PRTCVSRCMODULE;
363/** Pointer to a const source module subsection header. */
364typedef RTCVSRCMODULE const *PCRTCVSRCMODULE;
365
366/**
367 * CV4 source file, inside a kCvSst_SrcModule (see RTCVSRCMODULE::aoffSrcFiles)
368 *
369 * The aoffSrcLines member is followed by an array of segment ranges
370 * (RTCVSRCRANGE), cSegs in length. Just like for RTCVSRCMODULE this may
371 * contain zero entries.
372 *
373 * After the range table is the filename, which is preceeded by a 8-bit length
374 * (actually documented to be 16-bit, but seeing 8-bit here with wlink).
375 */
376typedef struct RTCVSRCFILE
377{
378 /** The number segments that this source file contributed to. */
379 uint16_t cSegs;
380 /** Alignment padding. */
381 uint16_t uPadding;
382 /** Offsets of the RTCVSRCLN entries for this source file, length given by
383 * the above cSegs member. Relative to the start of the subsection. */
384 uint32_t aoffSrcLines[1 /*cSegs*/];
385 /* RTCVSRCRANGE aSegRanges[cSegs]; */
386 /* uint8_t/uint16_t cchName; */
387 /* char achName[cchName]; */
388} RTCVSRCFILE;
389/** Pointer to a source file. */
390typedef RTCVSRCFILE *PRTCVSRCFILE;
391/** Pointer to a const source file. */
392typedef RTCVSRCFILE const *PCRTCVSRCFILE;
393
394/**
395 * CV4 line numbers header.
396 *
397 * The aoffLines member is followed by an array of line numbers (uint16_t).
398 */
399typedef struct RTCVSRCLINE
400{
401 /** The index of the segment these line numbers belong to. */
402 uint16_t idxSeg;
403 /** The number of line number pairs the two following tables. */
404 uint16_t cPairs;
405 /** Segment offsets, cPairs long. */
406 uint32_t aoffLines[1 /*cPairs*/];
407 /* uint16_t aiLines[cPairs]; */
408} RTCVSRCLINE;
409/** Pointer to a line numbers header. */
410typedef RTCVSRCLINE *PRTCVSRCLINE;
411/** Pointer to a const line numbers header. */
412typedef RTCVSRCLINE const *PCRTCVSRCLINE;
413
414
415/**
416 * Global symbol table header, used by kCvSst_GlobalSym and kCvSst_GlobalPub.
417 */
418typedef struct RTCVGLOBALSYMTABHDR
419{
420 /** The symbol hash function. */
421 uint16_t uSymHash;
422 /** The address hash function. */
423 uint16_t uAddrHash;
424 /** The amount of symbol information following immediately after the header. */
425 uint32_t cbSymbols;
426 /** The amount of symbol hash tables following the symbols. */
427 uint32_t cbSymHash;
428 /** The amount of address hash tables following the symbol hash tables. */
429 uint32_t cbAddrHash;
430} RTCVGLOBALSYMTABHDR;
431/** Pointer to a global symbol table header. */
432typedef RTCVGLOBALSYMTABHDR *PRTCVGLOBALSYMTABHDR;
433/** Pointer to a const global symbol table header. */
434typedef RTCVGLOBALSYMTABHDR const *PCRTCVGLOBALSYMTABHDR;
435
436
437typedef enum RTCVSYMTYPE
438{
439 /** @name Symbols that doesn't change with compilation model or target machine.
440 * @{ */
441 kCvSymType_Compile = 0x0001,
442 kCvSymType_Register,
443 kCvSymType_Constant,
444 kCvSymType_UDT,
445 kCvSymType_SSearch,
446 kCvSymType_End,
447 kCvSymType_Skip,
448 kCvSymType_CVReserve,
449 kCvSymType_ObjName,
450 kCvSymType_EndArg,
451 kCvSymType_CobolUDT,
452 kCvSymType_ManyReg,
453 kCvSymType_Return,
454 kCvSymType_EntryThis,
455 /** @} */
456
457 /** @name Symbols with 16:16 addresses.
458 * @{ */
459 kCvSymType_BpRel16 = 0x0100,
460 kCvSymType_LData16,
461 kCvSymType_GData16,
462 kCvSymType_Pub16,
463 kCvSymType_LProc16,
464 kCvSymType_GProc16,
465 kCvSymType_Thunk16,
466 kCvSymType_BLock16,
467 kCvSymType_With16,
468 kCvSymType_Label16,
469 kCvSymType_CExModel16,
470 kCvSymType_VftPath16,
471 kCvSymType_RegRel16,
472 /** @} */
473
474 /** @name Symbols with 16:32 addresses.
475 * @{ */
476 kCvSymType_BpRel32 = 0x0200,
477 kCvSymType_LData32,
478 kCvSymType_GData32,
479 kCvSymType_Pub32,
480 kCvSymType_LProc32,
481 kCvSymType_GProc32,
482 kCvSymType_Thunk32,
483 kCvSymType_Block32,
484 kCvSymType_With32,
485 kCvSymType_Label32,
486 kCvSymType_CExModel32,
487 kCvSymType_VftPath32,
488 kCvSymType_RegRel32,
489 kCvSymType_LThread32,
490 kCvSymType_GThread32,
491 /** @} */
492
493 /** @name Symbols for MIPS.
494 * @{ */
495 kCvSymType_LProcMips = 0x0300,
496 kCvSymType_GProcMips,
497 /** @} */
498
499 /** @name Symbols for Microsoft CodeView.
500 * @{ */
501 kCvSymType_ProcRef = 0x0400,
502 kCvSymType_DataRef,
503 kCvSymType_Align,
504 kCvSymType_LProcRef,
505 /** @} */
506
507 /** @name Symbols with 32-bit address (I think) and 32-bit type indices.
508 * @{ */
509 kCvSymType_V2_Register = 0x1001,
510 kCvSymType_V2_Constant,
511 kCvSymType_V2_Udt,
512 kCvSymType_V2_CobolUdt,
513 kCvSymType_V2_ManyReg,
514 kCvSymType_V2_BpRel,
515 kCvSymType_V2_LData,
516 kCvSymType_V2_GData,
517 kCvSymType_V2_Pub,
518 kCvSymType_V2_LProc,
519 kCvSymType_V2_GProc,
520 kCvSymType_V2_VftTable,
521 kCvSymType_V2_RegRel,
522 kCvSymType_V2_LThread,
523 kCvSymType_V2_GThread,
524 kCvSymType_V2_Unknown_1010,
525 kCvSymType_V2_Unknown_1011,
526 kCvSymType_V2_FrameInfo,
527 kCvSymType_V2_Compliand,
528 /** @} */
529
530 /** @name Version 3 symbol types.
531 * @{ */
532 /** Name of the object file, preceded by a 4-byte language type (ASM=0) */
533 kCvSymType_V3_Compliand = 0x1101,
534 kCvSymType_V3_Thunk,
535 kCvSymType_V3_Block,
536 kCvSymType_V3_Unknown_1104,
537 kCvSymType_V3_Label, /**< RTCVSYMV3LABEL */
538 kCvSymType_V3_Register,
539 kCvSymType_V3_Constant,
540 kCvSymType_V3_Udt,
541 kCvSymType_V3_Unknown_1109,
542 kCvSymType_V3_Unknown_110a,
543 kCvSymType_V3_BpRel,
544 kCvSymType_V3_LData, /**< RTCVSYMV3TYPEDNAME */
545 kCvSymType_V3_GData, /**< RTCVSYMV3TYPEDNAME */
546 kCvSymType_V3_Pub,
547 kCvSymType_V3_LProc,
548 kCvSymType_V3_GProc,
549 kCvSymType_V3_RegRel,
550 kCvSymType_V3_LThread,
551 kCvSymType_V3_GThread,
552 kCvSymType_V3_Unknown_1114,
553 kCvSymType_V3_Unknown_1115,
554 kCvSymType_V3_MSTool, /**< RTCVSYMV3MSTOOL */
555
556 kCvSymType_V3_PubFunc1 = 0x1125,
557 kCvSymType_V3_PubFunc2 = 0x1127,
558 kCvSymType_V3_SectInfo = 0x1136,
559 kCvSymType_V3_SubSectInfo,
560 kCvSymType_V3_Entrypoint,
561 kCvSymType_V3_Unknown_1139,
562 kCvSymType_V3_SecuCookie,
563 kCvSymType_V3_Unknown_113b,
564 kCvSymType_V3_MsToolInfo,
565 kCvSymType_V3_MsToolEnv,
566
567 kCvSymType_VS2013_Local,
568 kCvSymType_VS2013_FpOff = 0x1144,
569 kCvSymType_VS2013_LProc32 = 0x1146,
570 kCvSymType_VS2013_GProc32,
571 /** @} */
572
573 kCvSymType_EndOfValues
574} RTCVSYMTYPE;
575AssertCompile(kCvSymType_V3_Udt == 0x1108);
576AssertCompile(kCvSymType_V3_GProc == 0x1110);
577AssertCompile(kCvSymType_V3_MSTool == 0x1116);
578AssertCompile(kCvSymType_VS2013_Local == 0x113E);
579typedef RTCVSYMTYPE *PRTCVSYMTYPE;
580typedef RTCVSYMTYPE const *PCRTCVSYMTYPE;
581
582
583/**
584 * kCvSymType_V3_MSTool format.
585 */
586typedef struct RTCVSYMV3MSTOOL
587{
588 /** Language or tool ID (3 == masm). */
589 uint32_t uLanguage;
590 /** Target CPU (0xd0 == AMD64). */
591 uint32_t uTargetCpu;
592 /** Flags. */
593 uint32_t fFlags;
594 /** Version. */
595 uint32_t uVersion;
596 /** The creator name, zero terminated.
597 *
598 * It is followed by key/value pairs of zero terminated strings giving more
599 * details about the current directory ('cwd'), compiler executable ('cl'),
600 * full command line ('cmd'), source path relative to cwd ('src'), the
601 * full program database path ('pdb'), and possibly others. Terminated by a
602 * pair of empty strings, usually. */
603 char szCreator[1];
604} RTCVSYMV3MSTOOL;
605typedef RTCVSYMV3MSTOOL *PRTCVSYMV3MSTOOL;
606typedef RTCVSYMV3MSTOOL const *PCRTCVSYMV3MSTOOL;
607
608/**
609 * kCvSymType_V3_Label format.
610 */
611typedef struct RTCVSYMV3LABEL
612{
613 /** Offset into iSection of this symbol. */
614 uint32_t offSection;
615 /** The index of the section where the symbol lives. */
616 uint16_t iSection;
617 /** Flags or something. */
618 uint8_t fFlags;
619 /** Zero terminated symbol name (variable length). */
620 char szName[1];
621} RTCVSYMV3LABEL;
622AssertCompileSize(RTCVSYMV3LABEL, 8);
623typedef RTCVSYMV3LABEL *PRTCVSYMV3LABEL;
624typedef RTCVSYMV3LABEL const *PCRTCVSYMV3LABEL;
625
626/**
627 * kCvSymType_V3_LData and kCvSymType_V3_GData format.
628 */
629typedef struct RTCVSYMV3TYPEDNAME
630{
631 /** The type ID. */
632 uint32_t idType;
633 /** Offset into iSection of this symbol. */
634 uint32_t offSection;
635 /** The index of the section where the symbol lives. */
636 uint16_t iSection;
637 /** Zero terminated symbol name (variable length). */
638 char szName[2];
639} RTCVSYMV3TYPEDNAME;
640AssertCompileSize(RTCVSYMV3TYPEDNAME, 12);
641typedef RTCVSYMV3TYPEDNAME *PRTCVSYMV3TYPEDNAME;
642typedef RTCVSYMV3TYPEDNAME const *PCRTCVSYMV3TYPEDNAME;
643
644/**
645 * kCvSymType_V3_LProc and kCvSymType_V3_GProc format.
646 */
647typedef struct RTCVSYMV3PROC
648{
649 /** Lexical scope linking: Parent. */
650 uint32_t uParent;
651 /** Lexical scope linking: End. */
652 uint32_t uEnd;
653 /** Lexical scope linking: Next. */
654 uint32_t uNext;
655 /** The procedure length. */
656 uint32_t cbProc;
657 /** Offset into the procedure where the stack frame has been setup and is an
658 * excellent position for a function breakpoint. */
659 uint32_t offDebugStart;
660 /** Offset into the procedure where the procedure is ready to return and has a
661 * return value (if applicable). */
662 uint32_t offDebugEnd;
663 /** The type ID for the procedure. */
664 uint32_t idType;
665 /** Offset into iSection of this procedure. */
666 uint32_t offSection;
667 /** The index of the section where the procedure lives. */
668 uint16_t iSection;
669 /** Flags. */
670 uint8_t fFlags;
671 /** Zero terminated procedure name (variable length). */
672 char szName[1];
673} RTCVSYMV3PROC;
674AssertCompileSize(RTCVSYMV3PROC, 36);
675typedef RTCVSYMV3PROC *PRTCVSYMV3PROC;
676typedef RTCVSYMV3PROC const *PCRTCVSYMV3PROC;
677
678
679/** @name $$SYMBOLS signatures.
680 * @{ */
681/** The $$SYMBOL table signature for CV4. */
682#define RTCVSYMBOLS_SIGNATURE_CV4 UINT32_C(0x00000001)
683/** The $$SYMBOL table signature for CV8 (MSVC 8/2005).
684 * Also seen with MSVC 2010 using -Z7, so maybe more appropriate to call it
685 * CV7? */
686#define RTCVSYMBOLS_SIGNATURE_CV8 UINT32_C(0x00000004)
687/** @} */
688
689
690/**
691 * CV8 $$SYMBOLS block header.
692 */
693typedef struct RTCV8SYMBOLSBLOCK
694{
695 /** BLock type (RTCV8SYMBLOCK_TYPE_XXX). */
696 uint32_t uType;
697 /** The block length, including this header? */
698 uint32_t cb;
699} RTCV8SYMBOLSBLOCK;
700AssertCompileSize(RTCV8SYMBOLSBLOCK, 8);
701typedef RTCV8SYMBOLSBLOCK *PRTCV8SYMBOLSBLOCK;
702typedef RTCV8SYMBOLSBLOCK const *PCRTCV8SYMBOLSBLOCK;
703
704/** @name RTCV8SYMBLOCK_TYPE_XXX - CV8 (MSVC 8/2005) $$SYMBOL table types.
705 * @{ */
706/** Symbol information.
707 * Sequence of types. Each type entry starts with a 16-bit length followed
708 * by a 16-bit RTCVSYMTYPE value. Just like CV4/5, but with C-strings
709 * instead of pascal. */
710#define RTCV8SYMBLOCK_TYPE_SYMBOLS UINT32_C(0x000000f1)
711/** Line numbers for a section. */
712#define RTCV8SYMBLOCK_TYPE_SECT_LINES UINT32_C(0x000000f2)
713/** Source file string table.
714 * The strings are null terminated. Indexed by RTCV8SYMBLOCK_TYPE_SRC_INFO. */
715#define RTCV8SYMBLOCK_TYPE_SRC_STR UINT32_C(0x000000f3)
716/** Source file information. */
717#define RTCV8SYMBLOCK_TYPE_SRC_INFO UINT32_C(0x000000f4)
718/** @} */
719
720/**
721 * Line number header found in a RTCV8SYMBLOCK_TYPE_SECT_LINES block.
722 *
723 * This is followed by a sequence of RTCV8LINESSRCMAP structures.
724 */
725typedef struct RTCV8LINESHDR
726{
727 /** Offset into the section. */
728 uint32_t offSection;
729 /** The section number. */
730 uint16_t iSection;
731 /** Padding/zero/maybe-previous-member-is-a-32-bit-value. */
732 uint16_t u16Padding;
733 /** Number of bytes covered by this table, starting at offSection. */
734 uint32_t cbSectionCovered;
735} RTCV8LINESHDR;
736AssertCompileSize(RTCV8LINESHDR, 12);
737typedef RTCV8LINESHDR *PRTCV8LINESHDR;
738typedef RTCV8LINESHDR const *PCRTCV8LINESHDR;
739
740/**
741 * CV8 (MSVC 8/2005) line number source map.
742 *
743 * This is followed by an array of RTCV8LINEPAIR.
744 */
745typedef struct RTCV8LINESSRCMAP
746{
747 /** The source file, given as an offset (byte) into the source file
748 * information table (RTCV8SYMBLOCK_TYPE_SRC_INFO). */
749 uint32_t offSourceInfo;
750 /** Number of line numbers following this structure. */
751 uint32_t cLines;
752 /** The size of this source map. */
753 uint32_t cb;
754} RTCV8LINESSRCMAP;
755AssertCompileSize(RTCV8LINESSRCMAP, 12);
756typedef RTCV8LINESSRCMAP *PRTCV8LINESSRCMAP;
757typedef RTCV8LINESSRCMAP const *PCRTCV8LINESSRCMAP;
758
759/**
760 * One line number.
761 */
762typedef struct RTCV8LINEPAIR
763{
764 /** Offset into the section of this line number. */
765 uint32_t offSection;
766 /** The line number. */
767 uint32_t uLineNumber : 30;
768 /** Indicates that it's not possible to set breakpoint? */
769 uint32_t fEndOfStatement : 1;
770} RTCV8LINEPAIR;
771AssertCompileSize(RTCV8LINEPAIR, 8);
772typedef RTCV8LINEPAIR *PRTCV8LINEPAIR;
773typedef RTCV8LINEPAIR const *PCRTCV8LINEPAIR;
774
775/**
776 * Source file information found in a RTCV8SYMBLOCK_TYPE_SRC_INFO block.
777 */
778typedef struct RTCV8SRCINFO
779{
780 /** The source file name, given as an offset into the string table
781 * (RTCV8SYMBLOCK_TYPE_SRC_STR). */
782 uint32_t offSourceName;
783 /** Digest/checksum type. */
784 uint16_t uDigestType;
785 union
786 {
787 /** RTCV8SRCINFO_DIGEST_TYPE_MD5. */
788 struct
789 {
790 /** The digest. */
791 uint8_t ab[16];
792 /** Structur alignment padding. */
793 uint8_t abPadding[2];
794 } md5;
795 /** RTCV8SRCINFO_DIGEST_TYPE_NONE: Padding. */
796 uint8_t abNone[2];
797 } Digest;
798} RTCV8SRCINFO;
799AssertCompileSize(RTCV8SRCINFO, 24);
800typedef RTCV8SRCINFO *PRTCV8SRCINFO;
801typedef RTCV8SRCINFO const *PCRTCV8SRCINFO;
802
803/** @name RTCV8SRCINFO_DIGEST_TYPE_XXX - CV8 source digest types.
804 * Used by RTCV8SRCINFO::uDigestType.
805 * @{ */
806#define RTCV8SRCINFO_DIGEST_TYPE_NONE UINT16_C(0x0000)
807#define RTCV8SRCINFO_DIGEST_TYPE_MD5 UINT16_C(0x0110)
808/** @} */
809
810
811
812/**
813 * PDB v2.0 in image debug info.
814 * The URL is constructed from the timestamp and age?
815 */
816typedef struct CVPDB20INFO
817{
818 uint32_t u32Magic; /**< CVPDB20INFO_SIGNATURE. */
819 int32_t offDbgInfo; /**< Always 0. Used to be the offset to the real debug info. */
820 uint32_t uTimestamp;
821 uint32_t uAge;
822 uint8_t szPdbFilename[4];
823} CVPDB20INFO;
824/** Pointer to in executable image PDB v2.0 info. */
825typedef CVPDB20INFO *PCVPDB20INFO;
826/** Pointer to read only in executable image PDB v2.0 info. */
827typedef CVPDB20INFO const *PCCVPDB20INFO;
828/** The CVPDB20INFO magic value. */
829#define CVPDB20INFO_MAGIC RT_MAKE_U32_FROM_U8('N','B','1','0')
830
831/**
832 * PDB v7.0 in image debug info.
833 * The URL is constructed from the signature and the age.
834 */
835#pragma pack(4)
836typedef struct CVPDB70INFO
837{
838 uint32_t u32Magic; /**< CVPDB70INFO_SIGNATURE. */
839 RTUUID PdbUuid;
840 uint32_t uAge;
841 uint8_t szPdbFilename[4];
842} CVPDB70INFO;
843#pragma pack()
844AssertCompileMemberOffset(CVPDB70INFO, PdbUuid, 4);
845AssertCompileMemberOffset(CVPDB70INFO, uAge, 4 + 16);
846/** Pointer to in executable image PDB v7.0 info. */
847typedef CVPDB70INFO *PCVPDB70INFO;
848/** Pointer to read only in executable image PDB v7.0 info. */
849typedef CVPDB70INFO const *PCCVPDB70INFO;
850/** The CVPDB70INFO magic value. */
851#define CVPDB70INFO_MAGIC RT_MAKE_U32_FROM_U8('R','S','D','S')
852
853
854/** @} */
855
856#endif
857
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette