2 * File msc.c - read VC++ debug information from COFF and eventually
5 * Copyright (C) 1996, Eric Youngdale.
6 * Copyright (C) 1999, Ulrich Weigand.
8 * Note - this handles reading debug information for 32 bit applications
9 * that run under Windows-NT for example. I doubt that this would work well
10 * for 16 bit applications, but I don't think it really matters since the
11 * file format is different, and we should never get in here in such cases.
14 * Get 16 bit CV stuff working.
15 * Add symbol size to internal symbol table.
22 #include <sys/types.h>
23 #ifdef HAVE_SYS_MMAN_H
32 #define PATH_MAX _MAX_PATH
40 *dbg_filename must be at least MAX_PATHNAME_LEN bytes in size
42 static void LocateDebugInfoFile(char *filename
, char *dbg_filename
)
44 char *str1
= DBG_alloc(MAX_PATHNAME_LEN
*10);
45 char *str2
= DBG_alloc(MAX_PATHNAME_LEN
);
48 DOS_FULL_NAME fullname
;
50 file
= strrchr(filename
, '\\');
51 if( file
== NULL
) file
= filename
; else file
++;
53 if (GetEnvironmentVariableA("_NT_SYMBOL_PATH", str1
, MAX_PATHNAME_LEN
))
54 if (SearchPathA(str1
, file
, NULL
, MAX_PATHNAME_LEN
*10, str2
, &name_part
))
56 if (GetEnvironmentVariableA("_NT_ALT_SYMBOL_PATH", str1
, MAX_PATHNAME_LEN
))
57 if (SearchPathA(str1
, file
, NULL
, MAX_PATHNAME_LEN
*10, str2
, &name_part
))
59 if (SearchPathA(NULL
, file
, NULL
, MAX_PATHNAME_LEN
*10, str2
, &name_part
))
64 memcpy(dbg_filename
, filename
, MAX_PATHNAME_LEN
);
70 if (DOSFS_GetFullName(str2
, TRUE
, &fullname
))
71 memcpy(dbg_filename
, fullname
.long_name
, MAX_PATHNAME_LEN
);
79 * This is an index we use to keep track of the debug information
80 * when we have multiple sources. We use the same database to also
81 * allow us to do an 'info shared' type of deal, and we use the index
82 * to eliminate duplicates.
84 static int DEBUG_next_index
= 0;
95 * This is a convenience structure used to map portions of the
105 * This is how we reference the various record types.
107 union codeview_symbol
121 unsigned short symtype
;
122 unsigned char namelen
;
123 unsigned char name
[1];
130 unsigned int symtype
;
133 unsigned char namelen
;
134 unsigned char name
[1];
141 unsigned int pparent
;
145 unsigned short segment
;
146 unsigned short thunk_len
;
147 unsigned char thtype
;
148 unsigned char namelen
;
149 unsigned char name
[1];
156 unsigned int pparent
;
159 unsigned int proc_len
;
160 unsigned int debug_start
;
161 unsigned int debug_end
;
163 unsigned short segment
;
164 unsigned short proctype
;
166 unsigned char namelen
;
167 unsigned char name
[1];
174 unsigned int pparent
;
177 unsigned int proc_len
;
178 unsigned int debug_start
;
179 unsigned int debug_end
;
180 unsigned int proctype
;
182 unsigned short segment
;
184 unsigned char namelen
;
185 unsigned char name
[1];
190 short int len
; /* Total length of this entry */
191 short int id
; /* Always S_BPREL32 */
192 unsigned int offset
; /* Stack offset relative to BP */
193 unsigned short symtype
;
194 unsigned char namelen
;
195 unsigned char name
[1];
200 short int len
; /* Total length of this entry */
201 short int id
; /* Always S_BPREL32 */
202 unsigned int offset
; /* Stack offset relative to BP */
203 unsigned int symtype
;
204 unsigned char namelen
;
205 unsigned char name
[1];
224 unsigned char variant
[1];
231 unsigned int datatype
;
232 unsigned int attribute
;
233 unsigned char variant
[1];
241 unsigned char bitoff
;
251 unsigned char bitoff
;
260 unsigned char arrlen
;
261 unsigned char namelen
;
262 unsigned char name
[1];
269 unsigned int elemtype
;
270 unsigned int idxtype
;
271 unsigned char arrlen
;
272 unsigned char namelen
;
273 unsigned char name
[1];
285 unsigned short structlen
;
286 unsigned char namelen
;
287 unsigned char name
[1];
296 unsigned int fieldlist
;
297 unsigned int derived
;
299 unsigned short structlen
;
300 unsigned char namelen
;
301 unsigned char name
[1];
311 unsigned short un_len
;
312 unsigned char namelen
;
313 unsigned char name
[1];
323 unsigned short un_len
;
324 unsigned char namelen
;
325 unsigned char name
[1];
336 unsigned char namelen
;
337 unsigned char name
[1];
348 unsigned char namelen
;
349 unsigned char name
[1];
356 unsigned short int value
;
357 unsigned char namelen
;
358 unsigned char name
[1];
366 unsigned short int offset
;
367 unsigned char namelen
;
368 unsigned char name
[1];
376 unsigned short int offset
;
377 unsigned char namelen
;
378 unsigned char name
[1];
382 #define S_COMPILE 0x0001
383 #define S_REGISTER 0x0002
384 #define S_CONSTANT 0x0003
386 #define S_SSEARCH 0x0005
388 #define S_SKIP 0x0007
389 #define S_CVRESERVE 0x0008
390 #define S_OBJNAME 0x0009
391 #define S_ENDARG 0x000a
392 #define S_COBOLUDT 0x000b
393 #define S_MANYREG 0x000c
394 #define S_RETURN 0x000d
395 #define S_ENTRYTHIS 0x000e
397 #define S_BPREL 0x0200
398 #define S_LDATA 0x0201
399 #define S_GDATA 0x0202
401 #define S_LPROC 0x0204
402 #define S_GPROC 0x0205
403 #define S_THUNK 0x0206
404 #define S_BLOCK 0x0207
405 #define S_WITH 0x0208
406 #define S_LABEL 0x0209
407 #define S_CEXMODEL 0x020a
408 #define S_VFTPATH 0x020b
409 #define S_REGREL 0x020c
410 #define S_LTHREAD 0x020d
411 #define S_GTHREAD 0x020e
413 #define S_PROCREF 0x0400
414 #define S_DATAREF 0x0401
415 #define S_ALIGN 0x0402
416 #define S_LPROCREF 0x0403
418 #define S_REGISTER_32 0x1001 /* Variants with new 32-bit type indices */
419 #define S_CONSTANT_32 0x1002
420 #define S_UDT_32 0x1003
421 #define S_COBOLUDT_32 0x1004
422 #define S_MANYREG_32 0x1005
424 #define S_BPREL_32 0x1006
425 #define S_LDATA_32 0x1007
426 #define S_GDATA_32 0x1008
427 #define S_PUB_32 0x1009
428 #define S_LPROC_32 0x100a
429 #define S_GPROC_32 0x100b
430 #define S_VFTTABLE_32 0x100c
431 #define S_REGREL_32 0x100d
432 #define S_LTHREAD_32 0x100e
433 #define S_GTHREAD_32 0x100f
437 * This covers the basic datatypes that VC++ seems to be using these days.
438 * 32 bit mode only. There are additional numbers for the pointers in 16
439 * bit mode. There are many other types listed in the documents, but these
440 * are apparently not used by the compiler, or represent pointer types
443 #define T_NOTYPE 0x0000 /* Notype */
444 #define T_ABS 0x0001 /* Abs */
445 #define T_VOID 0x0003 /* Void */
446 #define T_CHAR 0x0010 /* signed char */
447 #define T_SHORT 0x0011 /* short */
448 #define T_LONG 0x0012 /* long */
449 #define T_QUAD 0x0013 /* long long */
450 #define T_UCHAR 0x0020 /* unsigned char */
451 #define T_USHORT 0x0021 /* unsigned short */
452 #define T_ULONG 0x0022 /* unsigned long */
453 #define T_UQUAD 0x0023 /* unsigned long long */
454 #define T_REAL32 0x0040 /* float */
455 #define T_REAL64 0x0041 /* double */
456 #define T_RCHAR 0x0070 /* real char */
457 #define T_WCHAR 0x0071 /* wide char */
458 #define T_INT4 0x0074 /* int */
459 #define T_UINT4 0x0075 /* unsigned int */
461 #define T_32PVOID 0x0403 /* 32 bit near pointer to void */
462 #define T_32PCHAR 0x0410 /* 16:32 near pointer to signed char */
463 #define T_32PSHORT 0x0411 /* 16:32 near pointer to short */
464 #define T_32PLONG 0x0412 /* 16:32 near pointer to int */
465 #define T_32PQUAD 0x0413 /* 16:32 near pointer to long long */
466 #define T_32PUCHAR 0x0420 /* 16:32 near pointer to unsigned char */
467 #define T_32PUSHORT 0x0421 /* 16:32 near pointer to unsigned short */
468 #define T_32PULONG 0x0422 /* 16:32 near pointer to unsigned int */
469 #define T_32PUQUAD 0x0423 /* 16:32 near pointer to long long */
470 #define T_32PREAL32 0x0440 /* 16:32 near pointer to float */
471 #define T_32PREAL64 0x0441 /* 16:32 near pointer to float */
472 #define T_32PRCHAR 0x0470 /* 16:32 near pointer to real char */
473 #define T_32PWCHAR 0x0471 /* 16:32 near pointer to real char */
474 #define T_32PINT4 0x0474 /* 16:32 near pointer to int */
475 #define T_32PUINT4 0x0475 /* 16:32 near pointer to unsigned int */
477 #define LF_MODIFIER 0x0001
478 #define LF_POINTER 0x0002
479 #define LF_ARRAY 0x0003
480 #define LF_CLASS 0x0004
481 #define LF_STRUCTURE 0x0005
482 #define LF_UNION 0x0006
483 #define LF_ENUM 0x0007
484 #define LF_PROCEDURE 0x0008
485 #define LF_MFUNCTION 0x0009
486 #define LF_VTSHAPE 0x000a
487 #define LF_COBOL0 0x000b
488 #define LF_COBOL1 0x000c
489 #define LF_BARRAY 0x000d
490 #define LF_LABEL 0x000e
491 #define LF_NULL 0x000f
492 #define LF_NOTTRAN 0x0010
493 #define LF_DIMARRAY 0x0011
494 #define LF_VFTPATH 0x0012
495 #define LF_PRECOMP 0x0013
496 #define LF_ENDPRECOMP 0x0014
497 #define LF_OEM 0x0015
498 #define LF_TYPESERVER 0x0016
500 #define LF_MODIFIER_32 0x1001 /* variants with new 32-bit type indices */
501 #define LF_POINTER_32 0x1002
502 #define LF_ARRAY_32 0x1003
503 #define LF_CLASS_32 0x1004
504 #define LF_STRUCTURE_32 0x1005
505 #define LF_UNION_32 0x1006
506 #define LF_ENUM_32 0x1007
507 #define LF_PROCEDURE_32 0x1008
508 #define LF_MFUNCTION_32 0x1009
509 #define LF_COBOL0_32 0x100a
510 #define LF_BARRAY_32 0x100b
511 #define LF_DIMARRAY_32 0x100c
512 #define LF_VFTPATH_32 0x100d
513 #define LF_PRECOMP_32 0x100e
514 #define LF_OEM_32 0x100f
516 #define LF_SKIP 0x0200
517 #define LF_ARGLIST 0x0201
518 #define LF_DEFARG 0x0202
519 #define LF_LIST 0x0203
520 #define LF_FIELDLIST 0x0204
521 #define LF_DERIVED 0x0205
522 #define LF_BITFIELD 0x0206
523 #define LF_METHODLIST 0x0207
524 #define LF_DIMCONU 0x0208
525 #define LF_DIMCONLU 0x0209
526 #define LF_DIMVARU 0x020a
527 #define LF_DIMVARLU 0x020b
528 #define LF_REFSYM 0x020c
530 #define LF_SKIP_32 0x1200 /* variants with new 32-bit type indices */
531 #define LF_ARGLIST_32 0x1201
532 #define LF_DEFARG_32 0x1202
533 #define LF_FIELDLIST_32 0x1203
534 #define LF_DERIVED_32 0x1204
535 #define LF_BITFIELD_32 0x1205
536 #define LF_METHODLIST_32 0x1206
537 #define LF_DIMCONU_32 0x1207
538 #define LF_DIMCONLU_32 0x1208
539 #define LF_DIMVARU_32 0x1209
540 #define LF_DIMVARLU_32 0x120a
542 #define LF_BCLASS 0x0400
543 #define LF_VBCLASS 0x0401
544 #define LF_IVBCLASS 0x0402
545 #define LF_ENUMERATE 0x0403
546 #define LF_FRIENDFCN 0x0404
547 #define LF_INDEX 0x0405
548 #define LF_MEMBER 0x0406
549 #define LF_STMEMBER 0x0407
550 #define LF_METHOD 0x0408
551 #define LF_NESTTYPE 0x0409
552 #define LF_VFUNCTAB 0x040a
553 #define LF_FRIENDCLS 0x040b
554 #define LF_ONEMETHOD 0x040c
555 #define LF_VFUNCOFF 0x040d
556 #define LF_NESTTYPEEX 0x040e
557 #define LF_MEMBERMODIFY 0x040f
559 #define LF_BCLASS_32 0x1400 /* variants with new 32-bit type indices */
560 #define LF_VBCLASS_32 0x1401
561 #define LF_IVBCLASS_32 0x1402
562 #define LF_FRIENDFCN_32 0x1403
563 #define LF_INDEX_32 0x1404
564 #define LF_MEMBER_32 0x1405
565 #define LF_STMEMBER_32 0x1406
566 #define LF_METHOD_32 0x1407
567 #define LF_NESTTYPE_32 0x1408
568 #define LF_VFUNCTAB_32 0x1409
569 #define LF_FRIENDCLS_32 0x140a
570 #define LF_ONEMETHOD_32 0x140b
571 #define LF_VFUNCOFF_32 0x140c
572 #define LF_NESTTYPEEX_32 0x140d
577 #define MAX_BUILTIN_TYPES 0x480
578 static struct datatype
* cv_basic_types
[MAX_BUILTIN_TYPES
];
579 static int num_cv_defined_types
= 0;
580 static struct datatype
**cv_defined_types
= NULL
;
583 * For the type CODEVIEW debug directory entries, the debug directory
584 * points to a structure like this. The cv_name field is the name
585 * of an external .PDB file.
590 unsigned int cv_timestamp
;
596 unsigned int DataType
;
604 * This is the header that the COFF variety of debug header points to.
608 unsigned int SymbolOffset
;
609 unsigned int N_Linenum
;
610 unsigned int LinenumberOffset
;
611 unsigned int Unused
[4];
615 unsigned int VirtualAddr
;
616 unsigned short int Linenum
;
620 unsigned int startaddr
;
621 unsigned int endaddr
;
625 struct name_hash
**entries
;
635 unsigned int NotLong
;
636 unsigned int StrTaboff
;
643 unsigned char NumberOfAuxSymbols
;
646 struct CoffAuxSection
{
648 unsigned short NumberOfRelocations
;
649 unsigned short NumberOfLinenumbers
;
650 unsigned int CheckSum
;
656 * These two structures are used in the directory within a .DBG file
657 * to locate the individual important bits that we might want to see.
660 short unsigned int dhsize
;
661 short unsigned int desize
;
663 unsigned int next_offset
;
668 short unsigned int subsect_number
;
669 short unsigned int module_number
;
675 * These are the values of interest that the subsect_number field takes.
677 #define sstAlignSym 0x125
678 #define sstSrcModule 0x127
680 struct codeview_linetab_hdr
687 unsigned short * linetab
;
688 unsigned int * offtab
;
693 ********************************************************************
695 struct deferred_debug_info
697 struct deferred_debug_info
* next
;
703 PIMAGE_DEBUG_DIRECTORY dbgdir
;
704 PIMAGE_SECTION_HEADER sectp
;
710 #define DF_STATUS_NEW 0
711 #define DF_STATUS_LOADED 1
712 #define DF_STATUS_ERROR 2
714 struct deferred_debug_info
* dbglist
= NULL
;
717 * A simple macro that tells us whether a given COFF symbol is a
720 #define N_TMASK 0x0030
721 #define IMAGE_SYM_DTYPE_FUNCTION 2
723 #define ISFCN(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_FUNCTION << N_BTSHFT))
727 * This is what we are looking for in the COFF symbols.
729 #define IMAGE_SYM_CLASS_EXTERNAL 0x2
730 #define IMAGE_SYM_CLASS_STATIC 0x3
731 #define IMAGE_SYM_CLASS_FILE 0x67
734 struct datatype
* DEBUG_GetCVType(unsigned int typeno
)
736 struct datatype
* dt
= NULL
;
739 * Convert Codeview type numbers into something we can grok internally.
740 * Numbers < 0x1000 are all fixed builtin types. Numbers from 0x1000 and
741 * up are all user defined (structs, etc).
743 if( typeno
< 0x1000 )
745 if( typeno
< MAX_BUILTIN_TYPES
)
747 dt
= cv_basic_types
[typeno
];
752 if( typeno
- 0x1000 < num_cv_defined_types
)
754 dt
= cv_defined_types
[typeno
- 0x1000];
762 DEBUG_ParseTypeTable(char * table
, int len
)
766 enum debug_type fieldtype
;
770 struct datatype
* subtype
;
772 union codeview_type
* type
;
773 union codeview_type
* type2
;
774 struct datatype
* typeptr
;
778 while( ptr
.c
- table
< len
)
780 type
= (union codeview_type
*) ptr
.c
;
782 if( curr_type
- 0x1000 >= num_cv_defined_types
)
784 num_cv_defined_types
+= 0x100;
785 cv_defined_types
= (struct datatype
**) DBG_realloc(cv_defined_types
,
786 num_cv_defined_types
* sizeof(struct datatype
*));
787 memset(cv_defined_types
+ num_cv_defined_types
- 0x100,
789 0x100 * sizeof(struct datatype
*));
790 if( cv_defined_types
== NULL
)
796 switch(type
->generic
.id
)
799 cv_defined_types
[curr_type
- 0x1000] =
800 DEBUG_FindOrMakePointerType(DEBUG_GetCVType(type
->pointer
.datatype
));
803 cv_defined_types
[curr_type
- 0x1000] =
804 DEBUG_FindOrMakePointerType(DEBUG_GetCVType(type
->pointer32
.datatype
));
807 if( type
->array
.arrlen
>= 0x8000 )
810 * This is a numeric leaf, I am too lazy to handle this right
813 fprintf(stderr
, "Ignoring large numberic leaf.\n");
816 if( type
->array
.namelen
!= 0 )
818 memset(symname
, 0, sizeof(symname
));
819 memcpy(symname
, type
->array
.name
, type
->array
.namelen
);
820 typeptr
= DEBUG_NewDataType(DT_ARRAY
, symname
);
824 typeptr
= DEBUG_NewDataType(DT_ARRAY
, NULL
);
826 cv_defined_types
[curr_type
- 0x1000] = typeptr
;
828 subtype
= DEBUG_GetCVType(type
->array
.elemtype
);
829 if( (subtype
== NULL
)
830 || (elem_size
= DEBUG_GetObjectSize(subtype
)) == 0 )
836 arr_max
= type
->array
.arrlen
/ DEBUG_GetObjectSize(subtype
);
839 DEBUG_SetArrayParams(typeptr
, 0, arr_max
, subtype
);
842 if( type
->array32
.arrlen
>= 0x8000 )
845 * This is a numeric leaf, I am too lazy to handle this right
848 fprintf(stderr
, "Ignoring large numberic leaf.\n");
851 if( type
->array32
.namelen
!= 0 )
853 memset(symname
, 0, sizeof(symname
));
854 memcpy(symname
, type
->array32
.name
, type
->array32
.namelen
);
855 typeptr
= DEBUG_NewDataType(DT_ARRAY
, symname
);
859 typeptr
= DEBUG_NewDataType(DT_ARRAY
, NULL
);
861 cv_defined_types
[curr_type
- 0x1000] = typeptr
;
863 subtype
= DEBUG_GetCVType(type
->array32
.elemtype
);
864 if( (subtype
== NULL
)
865 || (elem_size
= DEBUG_GetObjectSize(subtype
)) == 0 )
871 arr_max
= type
->array32
.arrlen
/ DEBUG_GetObjectSize(subtype
);
874 DEBUG_SetArrayParams(typeptr
, 0, arr_max
, subtype
);
878 * This is where the basic list of fields is defined for
879 * structures and classes.
881 * First, we need to look ahead and see whether we are building
882 * a fieldlist for an enum or a struct.
885 type2
= (union codeview_type
*) ptr2
.c
;
886 if( type2
->member
.id
== LF_MEMBER
)
888 typeptr
= DEBUG_NewDataType(DT_STRUCT
, NULL
);
889 fieldtype
= DT_STRUCT
;
891 else if( type2
->member
.id
== LF_ENUMERATE
)
893 typeptr
= DEBUG_NewDataType(DT_ENUM
, NULL
);
901 cv_defined_types
[curr_type
- 0x1000] = typeptr
;
902 while( ptr2
.c
< (ptr
.c
+ ((type
->generic
.len
+ 3) & ~3)) )
904 type2
= (union codeview_type
*) ptr2
.c
;
905 if( type2
->member
.id
== LF_MEMBER
&& fieldtype
== DT_STRUCT
)
907 memset(symname
, 0, sizeof(symname
));
908 memcpy(symname
, type2
->member
.name
, type2
->member
.namelen
);
910 subtype
= DEBUG_GetCVType(type2
->member
.type
);
912 if( subtype
!= NULL
)
914 elem_size
= DEBUG_GetObjectSize(subtype
);
917 if( type2
->member
.offset
>= 0x8000 )
920 * This is a numeric leaf, I am too lazy to handle this right
923 fprintf(stderr
, "Ignoring large numberic leaf.\n");
927 DEBUG_AddStructElement(typeptr
, symname
, subtype
,
928 type2
->member
.offset
<< 3,
932 else if( type2
->member
.id
== LF_ENUMERATE
&& fieldtype
== DT_ENUM
)
934 memset(symname
, 0, sizeof(symname
));
935 memcpy(symname
, type2
->enumerate
.name
, type2
->enumerate
.namelen
);
937 if( type2
->enumerate
.value
>= 0x8000 )
940 * This is a numeric leaf, I am too lazy to handle this right
943 fprintf(stderr
, "Ignoring large numberic leaf.\n");
947 DEBUG_AddStructElement(typeptr
, symname
, NULL
,
948 type2
->enumerate
.value
, 0);
954 * Something else I have never seen before. Either wrong type of
955 * object in the fieldlist, or some other problem which I wouldn't
956 * really know how to handle until it came up.
958 fprintf(stderr
, "Unexpected entry in fieldlist\n");
963 ptr2
.c
+= ((type2
->member
.namelen
+ 9 + 3) & ~3);
966 case LF_FIELDLIST_32
:
968 * This is where the basic list of fields is defined for
969 * structures and classes.
971 * First, we need to look ahead and see whether we are building
972 * a fieldlist for an enum or a struct.
975 type2
= (union codeview_type
*) ptr2
.c
;
976 if( type2
->member32
.id
== LF_MEMBER_32
)
978 typeptr
= DEBUG_NewDataType(DT_STRUCT
, NULL
);
979 fieldtype
= DT_STRUCT
;
981 else if( type2
->member32
.id
== LF_ENUMERATE
)
983 typeptr
= DEBUG_NewDataType(DT_ENUM
, NULL
);
991 cv_defined_types
[curr_type
- 0x1000] = typeptr
;
992 while( ptr2
.c
< (ptr
.c
+ ((type
->generic
.len
+ 3) & ~3)) )
994 type2
= (union codeview_type
*) ptr2
.c
;
995 if( type2
->member
.id
== LF_MEMBER_32
&& fieldtype
== DT_STRUCT
)
997 memset(symname
, 0, sizeof(symname
));
998 memcpy(symname
, type2
->member32
.name
, type2
->member32
.namelen
);
1000 subtype
= DEBUG_GetCVType(type2
->member32
.type
);
1002 if( subtype
!= NULL
)
1004 elem_size
= DEBUG_GetObjectSize(subtype
);
1007 if( type2
->member32
.offset
>= 0x8000 )
1010 * This is a numeric leaf, I am too lazy to handle this right
1013 fprintf(stderr
, "Ignoring large numberic leaf.\n");
1017 DEBUG_AddStructElement(typeptr
, symname
, subtype
,
1018 type2
->member32
.offset
<< 3,
1022 else if( type2
->member32
.id
== LF_ENUMERATE
&& fieldtype
== DT_ENUM
)
1024 memset(symname
, 0, sizeof(symname
));
1025 memcpy(symname
, type2
->enumerate
.name
, type2
->enumerate
.namelen
);
1027 if( type2
->enumerate
.value
>= 0x8000 )
1030 * This is a numeric leaf, I am too lazy to handle this right
1033 fprintf(stderr
, "Ignoring large numberic leaf.\n");
1037 DEBUG_AddStructElement(typeptr
, symname
, NULL
,
1038 type2
->enumerate
.value
, 0);
1044 * Something else I have never seen before. Either wrong type of
1045 * object in the fieldlist, or some other problem which I wouldn't
1046 * really know how to handle until it came up.
1048 fprintf(stderr
, "Unexpected entry in fieldlist\n");
1053 ptr2
.c
+= ((type2
->member32
.namelen
+ 9 + 3) & ~3);
1058 if( type
->structure
.structlen
>= 0x8000 )
1061 * This is a numeric leaf, I am too lazy to handle this right
1064 fprintf(stderr
, "Ignoring large numberic leaf.\n");
1067 memset(symname
, 0, sizeof(symname
));
1068 memcpy(symname
, type
->structure
.name
, type
->structure
.namelen
);
1069 if( strcmp(symname
, "__unnamed") == 0 )
1071 typeptr
= DEBUG_NewDataType(DT_STRUCT
, NULL
);
1075 typeptr
= DEBUG_NewDataType(DT_STRUCT
, symname
);
1077 cv_defined_types
[curr_type
- 0x1000] = typeptr
;
1080 * Now copy the relevant bits from the fieldlist that we specified.
1082 subtype
= DEBUG_GetCVType(type
->structure
.fieldlist
);
1084 if( subtype
!= NULL
)
1086 DEBUG_SetStructSize(typeptr
, type
->structure
.structlen
);
1087 DEBUG_CopyFieldlist(typeptr
, subtype
);
1090 case LF_STRUCTURE_32
:
1092 if( type
->structure32
.structlen
>= 0x8000 )
1095 * This is a numeric leaf, I am too lazy to handle this right
1098 fprintf(stderr
, "Ignoring large numberic leaf.\n");
1101 memset(symname
, 0, sizeof(symname
));
1102 memcpy(symname
, type
->structure32
.name
, type
->structure32
.namelen
);
1103 if( strcmp(symname
, "__unnamed") == 0 )
1105 typeptr
= DEBUG_NewDataType(DT_STRUCT
, NULL
);
1109 typeptr
= DEBUG_NewDataType(DT_STRUCT
, symname
);
1111 cv_defined_types
[curr_type
- 0x1000] = typeptr
;
1114 * Now copy the relevant bits from the fieldlist that we specified.
1116 subtype
= DEBUG_GetCVType(type
->structure32
.fieldlist
);
1118 if( subtype
!= NULL
)
1120 DEBUG_SetStructSize(typeptr
, type
->structure32
.structlen
);
1121 DEBUG_CopyFieldlist(typeptr
, subtype
);
1125 if( type
->t_union
.un_len
>= 0x8000 )
1128 * This is a numeric leaf, I am too lazy to handle this right
1131 fprintf(stderr
, "Ignoring large numberic leaf.\n");
1134 memset(symname
, 0, sizeof(symname
));
1135 memcpy(symname
, type
->t_union
.name
, type
->t_union
.namelen
);
1137 if( strcmp(symname
, "__unnamed") == 0 )
1139 typeptr
= DEBUG_NewDataType(DT_STRUCT
, NULL
);
1143 typeptr
= DEBUG_NewDataType(DT_STRUCT
, symname
);
1146 cv_defined_types
[curr_type
- 0x1000] = typeptr
;
1149 * Now copy the relevant bits from the fieldlist that we specified.
1151 subtype
= DEBUG_GetCVType(type
->t_union
.field
);
1153 if( subtype
!= NULL
)
1155 DEBUG_SetStructSize(typeptr
, type
->t_union
.un_len
);
1156 DEBUG_CopyFieldlist(typeptr
, subtype
);
1160 if( type
->t_union32
.un_len
>= 0x8000 )
1163 * This is a numeric leaf, I am too lazy to handle this right
1166 fprintf(stderr
, "Ignoring large numberic leaf.\n");
1169 memset(symname
, 0, sizeof(symname
));
1170 memcpy(symname
, type
->t_union32
.name
, type
->t_union32
.namelen
);
1172 if( strcmp(symname
, "__unnamed") == 0 )
1174 typeptr
= DEBUG_NewDataType(DT_STRUCT
, NULL
);
1178 typeptr
= DEBUG_NewDataType(DT_STRUCT
, symname
);
1181 cv_defined_types
[curr_type
- 0x1000] = typeptr
;
1184 * Now copy the relevant bits from the fieldlist that we specified.
1186 subtype
= DEBUG_GetCVType(type
->t_union32
.field
);
1188 if( subtype
!= NULL
)
1190 DEBUG_SetStructSize(typeptr
, type
->t_union32
.un_len
);
1191 DEBUG_CopyFieldlist(typeptr
, subtype
);
1195 typeptr
= DEBUG_NewDataType(DT_BITFIELD
, NULL
);
1196 cv_defined_types
[curr_type
- 0x1000] = typeptr
;
1197 DEBUG_SetBitfieldParams(typeptr
, type
->bitfield
.bitoff
,
1198 type
->bitfield
.nbits
,
1199 DEBUG_GetCVType(type
->bitfield
.type
));
1201 case LF_BITFIELD_32
:
1202 typeptr
= DEBUG_NewDataType(DT_BITFIELD
, NULL
);
1203 cv_defined_types
[curr_type
- 0x1000] = typeptr
;
1204 DEBUG_SetBitfieldParams(typeptr
, type
->bitfield32
.bitoff
,
1205 type
->bitfield32
.nbits
,
1206 DEBUG_GetCVType(type
->bitfield32
.type
));
1209 memset(symname
, 0, sizeof(symname
));
1210 memcpy(symname
, type
->enumeration
.name
, type
->enumeration
.namelen
);
1211 typeptr
= DEBUG_NewDataType(DT_ENUM
, symname
);
1212 cv_defined_types
[curr_type
- 0x1000] = typeptr
;
1215 * Now copy the relevant bits from the fieldlist that we specified.
1217 subtype
= DEBUG_GetCVType(type
->enumeration
.field
);
1219 if( subtype
!= NULL
)
1221 DEBUG_CopyFieldlist(typeptr
, subtype
);
1225 memset(symname
, 0, sizeof(symname
));
1226 memcpy(symname
, type
->enumeration32
.name
, type
->enumeration32
.namelen
);
1227 typeptr
= DEBUG_NewDataType(DT_ENUM
, symname
);
1228 cv_defined_types
[curr_type
- 0x1000] = typeptr
;
1231 * Now copy the relevant bits from the fieldlist that we specified.
1233 subtype
= DEBUG_GetCVType(type
->enumeration32
.field
);
1235 if( subtype
!= NULL
)
1237 DEBUG_CopyFieldlist(typeptr
, subtype
);
1244 ptr
.c
+= (type
->generic
.len
+ 3) & ~3;
1251 DEBUG_InitCVDataTypes()
1254 * These are the common builtin types that are used by VC++.
1256 cv_basic_types
[T_NOTYPE
] = NULL
;
1257 cv_basic_types
[T_ABS
] = NULL
;
1258 cv_basic_types
[T_VOID
] = DEBUG_NewDataType(DT_BASIC
, "void");
1259 cv_basic_types
[T_CHAR
] = DEBUG_NewDataType(DT_BASIC
, "char");
1260 cv_basic_types
[T_SHORT
] = DEBUG_NewDataType(DT_BASIC
, "short int");
1261 cv_basic_types
[T_LONG
] = DEBUG_NewDataType(DT_BASIC
, "long int");
1262 cv_basic_types
[T_QUAD
] = DEBUG_NewDataType(DT_BASIC
, "long long int");
1263 cv_basic_types
[T_UCHAR
] = DEBUG_NewDataType(DT_BASIC
, "unsigned char");
1264 cv_basic_types
[T_USHORT
] = DEBUG_NewDataType(DT_BASIC
, "short unsigned int");
1265 cv_basic_types
[T_ULONG
] = DEBUG_NewDataType(DT_BASIC
, "long unsigned int");
1266 cv_basic_types
[T_UQUAD
] = DEBUG_NewDataType(DT_BASIC
, "long long unsigned int");
1267 cv_basic_types
[T_REAL32
] = DEBUG_NewDataType(DT_BASIC
, "float");
1268 cv_basic_types
[T_REAL64
] = DEBUG_NewDataType(DT_BASIC
, "double");
1269 cv_basic_types
[T_RCHAR
] = DEBUG_NewDataType(DT_BASIC
, "char");
1270 cv_basic_types
[T_WCHAR
] = DEBUG_NewDataType(DT_BASIC
, "short");
1271 cv_basic_types
[T_INT4
] = DEBUG_NewDataType(DT_BASIC
, "int");
1272 cv_basic_types
[T_UINT4
] = DEBUG_NewDataType(DT_BASIC
, "unsigned int");
1274 cv_basic_types
[T_32PVOID
] = DEBUG_FindOrMakePointerType(cv_basic_types
[T_VOID
]);
1275 cv_basic_types
[T_32PCHAR
] = DEBUG_FindOrMakePointerType(cv_basic_types
[T_CHAR
]);
1276 cv_basic_types
[T_32PSHORT
] = DEBUG_FindOrMakePointerType(cv_basic_types
[T_SHORT
]);
1277 cv_basic_types
[T_32PLONG
] = DEBUG_FindOrMakePointerType(cv_basic_types
[T_LONG
]);
1278 cv_basic_types
[T_32PQUAD
] = DEBUG_FindOrMakePointerType(cv_basic_types
[T_QUAD
]);
1279 cv_basic_types
[T_32PUCHAR
] = DEBUG_FindOrMakePointerType(cv_basic_types
[T_UCHAR
]);
1280 cv_basic_types
[T_32PUSHORT
] = DEBUG_FindOrMakePointerType(cv_basic_types
[T_USHORT
]);
1281 cv_basic_types
[T_32PULONG
] = DEBUG_FindOrMakePointerType(cv_basic_types
[T_ULONG
]);
1282 cv_basic_types
[T_32PUQUAD
] = DEBUG_FindOrMakePointerType(cv_basic_types
[T_UQUAD
]);
1283 cv_basic_types
[T_32PREAL32
] = DEBUG_FindOrMakePointerType(cv_basic_types
[T_REAL32
]);
1284 cv_basic_types
[T_32PREAL64
] = DEBUG_FindOrMakePointerType(cv_basic_types
[T_REAL64
]);
1285 cv_basic_types
[T_32PRCHAR
] = DEBUG_FindOrMakePointerType(cv_basic_types
[T_RCHAR
]);
1286 cv_basic_types
[T_32PWCHAR
] = DEBUG_FindOrMakePointerType(cv_basic_types
[T_WCHAR
]);
1287 cv_basic_types
[T_32PINT4
] = DEBUG_FindOrMakePointerType(cv_basic_types
[T_INT4
]);
1288 cv_basic_types
[T_32PUINT4
] = DEBUG_FindOrMakePointerType(cv_basic_types
[T_UINT4
]);
1292 * In this function, we keep track of deferred debugging information
1293 * that we may need later if we were to need to use the internal debugger.
1294 * We don't fully process it here for performance reasons.
1297 DEBUG_RegisterDebugInfo( HMODULE hModule
, const char *module_name
)
1299 int has_codeview
= FALSE
;
1302 PIMAGE_DEBUG_DIRECTORY dbgptr
;
1303 u_long v_addr
, size
;
1304 PIMAGE_NT_HEADERS nth
= PE_HEADER(hModule
);
1306 size
= nth
->OptionalHeader
.DataDirectory
[IMAGE_DIRECTORY_ENTRY_DEBUG
].Size
;
1308 v_addr
= nth
->OptionalHeader
.DataDirectory
[IMAGE_DIRECTORY_ENTRY_DEBUG
].VirtualAddress
;
1309 dbgptr
= (PIMAGE_DEBUG_DIRECTORY
) (hModule
+ v_addr
);
1311 for(; size
>= sizeof(*dbgptr
); size
-= sizeof(*dbgptr
), dbgptr
++ )
1313 switch(dbgptr
->Type
)
1315 case IMAGE_DEBUG_TYPE_CODEVIEW
:
1316 case IMAGE_DEBUG_TYPE_MISC
:
1317 has_codeview
= TRUE
;
1323 dbgptr
= (PIMAGE_DEBUG_DIRECTORY
) (hModule
+ v_addr
);
1324 for(; size
>= sizeof(*dbgptr
); size
-= sizeof(*dbgptr
), dbgptr
++ )
1326 switch(dbgptr
->Type
)
1328 case IMAGE_DEBUG_TYPE_COFF
:
1330 * If we have both codeview and COFF debug info, ignore the
1331 * coff debug info as it would just confuse us, and it is
1334 * FIXME - this is broken - if we cannot find the PDB file, then
1335 * we end up with no debugging info at all. In this case, we
1336 * should use the COFF info as a backup.
1342 case IMAGE_DEBUG_TYPE_CODEVIEW
:
1343 case IMAGE_DEBUG_TYPE_MISC
:
1345 * This is usually an indirection to a .DBG file.
1346 * This is similar to (but a slightly older format) from the
1349 * First check to see if the image was 'stripped'. If so, it
1350 * means that this entry points to a .DBG file. Otherwise,
1351 * it just points to itself, and we can ignore this.
1359 if( (dbgptr
->Type
!= IMAGE_DEBUG_TYPE_MISC
) ||
1360 (PE_HEADER(hModule
)->FileHeader
.Characteristics
& IMAGE_FILE_DEBUG_STRIPPED
) != 0 )
1364 DOS_FULL_NAME full_name
;
1365 struct deferred_debug_info
* deefer
= (struct deferred_debug_info
*) DBG_alloc(sizeof(*deefer
));
1367 deefer
->module
= hModule
;
1368 deefer
->load_addr
= (char *)hModule
;
1371 * Read the important bits. What we do after this depends
1372 * upon the type, but this is always enough so we are able
1373 * to proceed if we know what we need to do next.
1375 /* basically, the PE loader maps all sections (data, resources...), but doesn't map
1376 * the DataDirectory array's content. One its entry contains the *beloved*
1377 * debug information. (Note the DataDirectory is mapped, not its content)
1380 if (GetModuleFileNameA(hModule
, fn
, sizeof(fn
)) > 0 &&
1381 DOSFS_GetFullName(fn
, TRUE
, &full_name
) &&
1382 (fd
= open(full_name
.long_name
, O_RDONLY
)) > 0)
1384 deefer
->dbg_info
= mmap(NULL
, dbgptr
->SizeOfData
,
1385 PROT_READ
, MAP_PRIVATE
, fd
, dbgptr
->PointerToRawData
);
1387 if( deefer
->dbg_info
== (char *) 0xffffffff )
1396 fprintf(stderr
, " (not mapped: fn=%s, lfn=%s, fd=%d)", fn
, full_name
.long_name
, fd
);
1399 deefer
->dbg_size
= dbgptr
->SizeOfData
;
1400 deefer
->dbgdir
= dbgptr
;
1401 deefer
->next
= dbglist
;
1402 deefer
->status
= DF_STATUS_NEW
;
1403 deefer
->dbg_index
= DEBUG_next_index
;
1404 deefer
->module_name
= DBG_strdup(module_name
);
1406 deefer
->sectp
= PE_SECTIONS(hModule
);
1407 deefer
->nsect
= PE_HEADER(hModule
)->FileHeader
.NumberOfSections
;
1419 /* look for .stabs/.stabstr sections */
1421 PIMAGE_SECTION_HEADER pe_seg
= PE_SECTIONS(hModule
);
1422 int i
,stabsize
=0,stabstrsize
=0;
1423 unsigned int stabs
=0,stabstr
=0;
1425 for (i
=0;i
<nth
->FileHeader
.NumberOfSections
;i
++) {
1426 if (!strcasecmp(pe_seg
[i
].Name
,".stab")) {
1427 stabs
= pe_seg
[i
].VirtualAddress
;
1428 stabsize
= pe_seg
[i
].SizeOfRawData
;
1430 if (!strncasecmp(pe_seg
[i
].Name
,".stabstr",8)) {
1431 stabstr
= pe_seg
[i
].VirtualAddress
;
1432 stabstrsize
= pe_seg
[i
].SizeOfRawData
;
1435 if (stabstrsize
&& stabsize
) {
1436 #ifdef _WE_SUPPORT_THE_STAB_TYPES_USED_BY_MINGW_TOO
1437 /* Won't work currently, since MINGW32 uses some special typedefs
1438 * which we do not handle yet. Support for them is a bit difficult.
1440 DEBUG_ParseStabs(hModule
,0,stabs
,stabsize
,stabstr
,stabstrsize
);
1442 fprintf(stderr
,"(stabs not loaded)");
1449 * ELF modules are also entered into the list - this is so that we
1450 * can make 'info shared' types of displays possible.
1453 DEBUG_RegisterELFDebugInfo(int load_addr
, u_long size
, char * name
)
1455 struct deferred_debug_info
* deefer
;
1457 deefer
= (struct deferred_debug_info
*) DBG_alloc(sizeof(*deefer
));
1461 * Read the important bits. What we do after this depends
1462 * upon the type, but this is always enough so we are able
1463 * to proceed if we know what we need to do next.
1465 deefer
->dbg_size
= size
;
1466 deefer
->dbg_info
= (char *) NULL
;
1468 deefer
->load_addr
= (char *) load_addr
;
1469 deefer
->dbgdir
= NULL
;
1470 deefer
->next
= dbglist
;
1471 deefer
->status
= DF_STATUS_LOADED
;
1472 deefer
->dbg_index
= DEBUG_next_index
;
1473 deefer
->module_name
= DBG_strdup(name
);
1484 * Process COFF debugging information embedded in a Win32 application.
1489 DEBUG_ProcessCoff(struct deferred_debug_info
* deefer
)
1491 struct CoffAuxSection
* aux
;
1492 struct CoffDebug
* coff
;
1493 struct CoffFiles
* coff_files
= NULL
;
1494 struct CoffLinenum
* coff_linetab
;
1496 struct CoffSymbol
* coff_sym
;
1497 struct CoffSymbol
* coff_symbol
;
1498 struct CoffFiles
* curr_file
= NULL
;
1502 struct CoffLinenum
* linepnt
;
1509 int nfiles_alloc
= 0;
1510 struct CoffFiles orig_file
;
1512 char * this_file
= NULL
;
1514 coff
= (struct CoffDebug
*) deefer
->dbg_info
;
1516 coff_symbol
= (struct CoffSymbol
*) ((unsigned int) coff
+ coff
->SymbolOffset
);
1517 coff_linetab
= (struct CoffLinenum
*) ((unsigned int) coff
+ coff
->LinenumberOffset
);
1518 coff_strtab
= (char *) ((unsigned int) coff_symbol
+ 18*coff
->N_Sym
);
1522 for(i
=0; i
< coff
->N_Sym
; i
++ )
1525 * We do this because some compilers (i.e. gcc) incorrectly
1526 * pad the structure up to a 4 byte boundary. The structure
1527 * is really only 18 bytes long, so we have to manually make sure
1530 * FIXME - there must be a way to have autoconf figure out the
1531 * correct compiler option for this. If it is always gcc, that
1532 * makes life simpler, but I don't want to force this.
1534 coff_sym
= (struct CoffSymbol
*) ((unsigned int) coff_symbol
+ 18*i
);
1535 naux
= coff_sym
->NumberOfAuxSymbols
;
1537 if( coff_sym
->StorageClass
== IMAGE_SYM_CLASS_FILE
)
1539 if( nfiles
+ 1 >= nfiles_alloc
)
1542 coff_files
= (struct CoffFiles
*) DBG_realloc(coff_files
,
1543 nfiles_alloc
* sizeof(struct CoffFiles
));
1545 curr_file
= coff_files
+ nfiles
;
1547 curr_file
->startaddr
= 0xffffffff;
1548 curr_file
->endaddr
= 0;
1549 curr_file
->filename
= ((char *) coff_sym
) + 18;
1550 curr_file
->linetab_offset
= -1;
1551 curr_file
->linecnt
= 0;
1552 curr_file
->entries
= NULL
;
1553 curr_file
->neps
= curr_file
->neps_alloc
= 0;
1555 fprintf(stderr
,"New file %s\n", curr_file
->filename
);
1562 * This guy marks the size and location of the text section
1563 * for the current file. We need to keep track of this so
1564 * we can figure out what file the different global functions
1567 if( (coff_sym
->StorageClass
== IMAGE_SYM_CLASS_STATIC
)
1569 && (coff_sym
->Type
== 0)
1570 && (coff_sym
->SectionNumber
== 1) )
1572 aux
= (struct CoffAuxSection
*) ((unsigned int) coff_sym
+ 18);
1574 if( curr_file
->linetab_offset
!= -1 )
1577 fprintf(stderr
, "Duplicating sect from %s: %x %x %x %d %d\n",
1578 curr_file
->filename
,
1580 aux
->NumberOfRelocations
,
1581 aux
->NumberOfLinenumbers
,
1584 fprintf(stderr
, "More sect %d %x %d %d %d\n",
1585 coff_sym
->SectionNumber
,
1588 coff_sym
->StorageClass
,
1589 coff_sym
->NumberOfAuxSymbols
);
1593 * Save this so we can copy bits from it.
1595 orig_file
= *curr_file
;
1598 * Duplicate the file entry. We have no way to describe
1599 * multiple text sections in our current way of handling things.
1601 if( nfiles
+ 1 >= nfiles_alloc
)
1604 coff_files
= (struct CoffFiles
*) DBG_realloc(coff_files
,
1605 nfiles_alloc
* sizeof(struct CoffFiles
));
1607 curr_file
= coff_files
+ nfiles
;
1609 curr_file
->startaddr
= 0xffffffff;
1610 curr_file
->endaddr
= 0;
1611 curr_file
->filename
= orig_file
.filename
;
1612 curr_file
->linetab_offset
= -1;
1613 curr_file
->linecnt
= 0;
1614 curr_file
->entries
= NULL
;
1615 curr_file
->neps
= curr_file
->neps_alloc
= 0;
1620 fprintf(stderr
, "New text sect from %s: %x %x %x %d %d\n",
1621 curr_file
->filename
,
1623 aux
->NumberOfRelocations
,
1624 aux
->NumberOfLinenumbers
,
1630 if( curr_file
->startaddr
> coff_sym
->Value
)
1632 curr_file
->startaddr
= coff_sym
->Value
;
1635 if( curr_file
->startaddr
> coff_sym
->Value
)
1637 curr_file
->startaddr
= coff_sym
->Value
;
1640 if( curr_file
->endaddr
< coff_sym
->Value
+ aux
->Length
)
1642 curr_file
->endaddr
= coff_sym
->Value
+ aux
->Length
;
1645 curr_file
->linetab_offset
= linetab_indx
;
1646 curr_file
->linecnt
= aux
->NumberOfLinenumbers
;
1647 linetab_indx
+= aux
->NumberOfLinenumbers
;
1652 if( (coff_sym
->StorageClass
== IMAGE_SYM_CLASS_STATIC
)
1654 && (coff_sym
->SectionNumber
== 1) )
1657 * This is a normal static function when naux == 0.
1658 * Just register it. The current file is the correct
1659 * one in this instance.
1661 if( coff_sym
->N
.Name
.NotLong
)
1663 memcpy(namebuff
, coff_sym
->N
.ShortName
, 8);
1665 nampnt
= &namebuff
[0];
1669 nampnt
= coff_strtab
+ coff_sym
->N
.Name
.StrTaboff
;
1672 if( nampnt
[0] == '_' )
1678 new_addr
.off
= (int) (deefer
->load_addr
+ coff_sym
->Value
);
1680 if( curr_file
->neps
+ 1 >= curr_file
->neps_alloc
)
1682 curr_file
->neps_alloc
+= 10;
1683 curr_file
->entries
= (struct name_hash
**)
1684 DBG_realloc(curr_file
->entries
,
1685 curr_file
->neps_alloc
* sizeof(struct name_hash
*));
1688 fprintf(stderr
,"\tAdding static symbol %s\n", nampnt
);
1690 curr_file
->entries
[curr_file
->neps
++] =
1691 DEBUG_AddSymbol( nampnt
, &new_addr
, this_file
, SYM_WIN32
);
1696 if( (coff_sym
->StorageClass
== IMAGE_SYM_CLASS_EXTERNAL
)
1697 && ISFCN(coff_sym
->Type
)
1698 && (coff_sym
->SectionNumber
> 0) )
1700 if( coff_sym
->N
.Name
.NotLong
)
1702 memcpy(namebuff
, coff_sym
->N
.ShortName
, 8);
1704 nampnt
= &namebuff
[0];
1708 nampnt
= coff_strtab
+ coff_sym
->N
.Name
.StrTaboff
;
1712 if( nampnt
[0] == '_' )
1718 new_addr
.off
= (int) (deefer
->load_addr
+ coff_sym
->Value
);
1721 fprintf(stderr
, "%d: %x %s\n", i
, new_addr
.off
, nampnt
);
1723 fprintf(stderr
,"\tAdding global symbol %s\n", nampnt
);
1727 * Now we need to figure out which file this guy belongs to.
1730 for(j
=0; j
< nfiles
; j
++)
1732 if( coff_files
[j
].startaddr
<= coff_sym
->Value
1733 && coff_files
[j
].endaddr
> coff_sym
->Value
)
1735 this_file
= coff_files
[j
].filename
;
1739 if( coff_files
[j
].neps
+ 1 >= coff_files
[j
].neps_alloc
)
1741 coff_files
[j
].neps_alloc
+= 10;
1742 coff_files
[j
].entries
= (struct name_hash
**)
1743 DBG_realloc(coff_files
[j
].entries
,
1744 coff_files
[j
].neps_alloc
* sizeof(struct name_hash
*));
1746 coff_files
[j
].entries
[coff_files
[j
].neps
++] =
1747 DEBUG_AddSymbol( nampnt
, &new_addr
, this_file
, SYM_WIN32
);
1752 if( (coff_sym
->StorageClass
== IMAGE_SYM_CLASS_EXTERNAL
)
1753 && (coff_sym
->SectionNumber
> 0) )
1756 * Similar to above, but for the case of data symbols.
1757 * These aren't treated as entrypoints.
1759 if( coff_sym
->N
.Name
.NotLong
)
1761 memcpy(namebuff
, coff_sym
->N
.ShortName
, 8);
1763 nampnt
= &namebuff
[0];
1767 nampnt
= coff_strtab
+ coff_sym
->N
.Name
.StrTaboff
;
1771 if( nampnt
[0] == '_' )
1777 new_addr
.off
= (int) (deefer
->load_addr
+ coff_sym
->Value
);
1780 fprintf(stderr
, "%d: %x %s\n", i
, new_addr
.off
, nampnt
);
1782 fprintf(stderr
,"\tAdding global data symbol %s\n", nampnt
);
1786 * Now we need to figure out which file this guy belongs to.
1788 DEBUG_AddSymbol( nampnt
, &new_addr
, NULL
, SYM_WIN32
);
1793 if( (coff_sym
->StorageClass
== IMAGE_SYM_CLASS_STATIC
)
1797 * Ignore these. They don't have anything to do with
1805 fprintf(stderr
,"Skipping unknown entry %d %d %d\n", coff_sym
->StorageClass
,
1806 coff_sym
->SectionNumber
, naux
);
1810 * For now, skip past the aux entries.
1817 * OK, we now should have a list of files, and we should have a list
1818 * of entrypoints. We need to sort the entrypoints so that we are
1819 * able to tie the line numbers with the given functions within the
1822 if( coff_files
!= NULL
)
1824 for(j
=0; j
< nfiles
; j
++)
1826 if( coff_files
[j
].entries
!= NULL
)
1828 qsort(coff_files
[j
].entries
, coff_files
[j
].neps
,
1829 sizeof(struct name_hash
*), DEBUG_cmp_sym
);
1834 * Now pick apart the line number tables, and attach the entries
1835 * to the given functions.
1837 for(j
=0; j
< nfiles
; j
++)
1840 if( coff_files
[j
].neps
!= 0 )
1841 for(k
=0; k
< coff_files
[j
].linecnt
; k
++)
1844 * Another monstrosity caused by the fact that we are using
1845 * a 6 byte structure, and gcc wants to pad structures to 4 byte
1846 * boundaries. Otherwise we could just index into an array.
1848 linepnt
= (struct CoffLinenum
*)
1849 ((unsigned int) coff_linetab
+
1850 6*(coff_files
[j
].linetab_offset
+ k
));
1852 * If we have spilled onto the next entrypoint, then
1853 * bump the counter..
1857 if (i
+1 >= coff_files
[j
].neps
) break;
1858 DEBUG_GetSymbolAddr(coff_files
[j
].entries
[i
+1], &new_addr
);
1859 if( (((unsigned int)deefer
->load_addr
+
1860 linepnt
->VirtualAddr
) >= new_addr
.off
) )
1867 * Add the line number. This is always relative to the
1868 * start of the function, so we need to subtract that offset
1871 DEBUG_GetSymbolAddr(coff_files
[j
].entries
[i
], &new_addr
);
1872 DEBUG_AddLineNumber(coff_files
[j
].entries
[i
],
1874 (unsigned int) deefer
->load_addr
1875 + linepnt
->VirtualAddr
1883 if( coff_files
!= NULL
)
1885 for(j
=0; j
< nfiles
; j
++)
1887 if( coff_files
[j
].entries
!= NULL
)
1889 DBG_free(coff_files
[j
].entries
);
1892 DBG_free(coff_files
);
1900 * Process a codeview line number table. Digestify the thing so that
1901 * we can easily reference the thing when we process the rest of
1904 static struct codeview_linetab_hdr
*
1905 DEBUG_SnarfLinetab(char * linetab
,
1909 char filename
[PATH_MAX
];
1910 unsigned int * filetab
;
1914 struct codeview_linetab_hdr
* lt_hdr
;
1915 unsigned int * lt_ptr
;
1919 union any_size pnt2
;
1920 struct startend
* start
;
1924 * Now get the important bits.
1930 filetab
= (unsigned int *) pnt
.c
;
1933 * Now count up the number of segments in the file.
1936 for(i
=0; i
<nfile
; i
++)
1938 pnt2
.c
= linetab
+ filetab
[i
];
1943 * Next allocate the header we will be returning.
1944 * There is one header for each segment, so that we can reach in
1945 * and pull bits as required.
1947 lt_hdr
= (struct codeview_linetab_hdr
*)
1948 DBG_alloc((nseg
+ 1) * sizeof(*lt_hdr
));
1949 if( lt_hdr
== NULL
)
1954 memset(lt_hdr
, 0, sizeof(*lt_hdr
) * (nseg
+1));
1957 * Now fill the header we will be returning, one for each segment.
1958 * Note that this will basically just contain pointers into the existing
1959 * line table, and we do not actually copy any additional information
1960 * or allocate any additional memory.
1964 for(i
=0; i
<nfile
; i
++)
1967 * Get the pointer into the segment information.
1969 pnt2
.c
= linetab
+ filetab
[i
];
1970 file_segcount
= *pnt2
.s
;
1973 lt_ptr
= (unsigned int *) pnt2
.c
;
1974 start
= (struct startend
*) (lt_ptr
+ file_segcount
);
1977 * Now snarf the filename for all of the segments for this file.
1979 fn
= (unsigned char *) (start
+ file_segcount
);
1980 memset(filename
, 0, sizeof(filename
));
1981 memcpy(filename
, fn
+ 1, *fn
);
1982 fn
= DBG_strdup(filename
);
1984 for(k
= 0; k
< file_segcount
; k
++, this_seg
++)
1986 pnt2
.c
= linetab
+ lt_ptr
[k
];
1987 lt_hdr
[this_seg
].start
= start
[k
].start
;
1988 lt_hdr
[this_seg
].end
= start
[k
].end
;
1989 lt_hdr
[this_seg
].sourcefile
= fn
;
1990 lt_hdr
[this_seg
].segno
= *pnt2
.s
++;
1991 lt_hdr
[this_seg
].nline
= *pnt2
.s
++;
1992 lt_hdr
[this_seg
].offtab
= pnt2
.ui
;
1993 lt_hdr
[this_seg
].linetab
= (unsigned short *)
1994 (pnt2
.ui
+ lt_hdr
[this_seg
].nline
);
2005 DEBUG_SnarfCodeView( struct deferred_debug_info
* deefer
,
2008 struct codeview_linetab_hdr
* linetab
)
2010 struct name_hash
* curr_func
= NULL
;
2011 struct wine_locals
* curr_sym
= NULL
;
2018 IMAGE_SECTION_HEADER
* sectp
;
2019 union codeview_symbol
* sym
;
2020 char symname
[PATH_MAX
];
2021 struct name_hash
* thunk_sym
= NULL
;
2024 nsect
= deefer
->nsect
;
2025 sectp
= deefer
->sectp
;
2028 * Loop over the different types of records and whenever we
2029 * find something we are interested in, record it and move on.
2031 while( ptr
.c
- cv_data
< size
)
2033 sym
= (union codeview_symbol
*) ptr
.c
;
2035 if( sym
->generic
.len
- sizeof(int) == (ptr
.c
- cv_data
) )
2038 * This happens when we have indirect symbols that VC++ 4.2
2039 * sometimes uses when there isn't a line number table.
2040 * We ignore it - we will process and enter all of the
2041 * symbols in the global symbol table anyways, so there
2042 * isn't much point in keeping track of all of this crap.
2047 memset(symname
, 0, sizeof(symname
));
2048 switch(sym
->generic
.id
)
2054 * First, a couple of sanity checks.
2056 if( sym
->data
.namelen
== 0 )
2061 if( sym
->data
.seg
== 0 || sym
->data
.seg
> nsect
)
2067 * Global and local data symbols. We don't associate these
2068 * with any given source file.
2071 memcpy(symname
, sym
->data
.name
, sym
->data
.namelen
);
2073 new_addr
.type
= DEBUG_GetCVType(sym
->data
.symtype
);
2074 new_addr
.off
= (unsigned int) deefer
->load_addr
+
2075 sectp
[sym
->data
.seg
- 1].VirtualAddress
+
2077 DEBUG_AddSymbol( symname
, &new_addr
, NULL
, SYM_WIN32
| SYM_DATA
);
2083 * First, a couple of sanity checks.
2085 if( sym
->data32
.namelen
== 0 )
2090 if( sym
->data32
.seg
== 0 || sym
->data32
.seg
> nsect
)
2096 * Global and local data symbols. We don't associate these
2097 * with any given source file.
2100 memcpy(symname
, sym
->data32
.name
, sym
->data32
.namelen
);
2102 new_addr
.type
= DEBUG_GetCVType(sym
->data32
.symtype
);
2103 new_addr
.off
= (unsigned int) deefer
->load_addr
+
2104 sectp
[sym
->data32
.seg
- 1].VirtualAddress
+
2106 DEBUG_AddSymbol( symname
, &new_addr
, NULL
, SYM_WIN32
| SYM_DATA
);
2110 * Sort of like a global function, but it just points
2111 * to a thunk, which is a stupid name for what amounts to
2112 * a PLT slot in the normal jargon that everyone else uses.
2114 memcpy(symname
, sym
->thunk
.name
, sym
->thunk
.namelen
);
2116 new_addr
.type
= NULL
;
2117 new_addr
.off
= (unsigned int) deefer
->load_addr
+
2118 sectp
[sym
->thunk
.segment
- 1].VirtualAddress
+
2120 thunk_sym
= DEBUG_AddSymbol( symname
, &new_addr
, NULL
,
2121 SYM_WIN32
| SYM_FUNC
);
2122 DEBUG_SetSymbolSize(thunk_sym
, sym
->thunk
.thunk_len
);
2127 * Global and static functions.
2129 memcpy(symname
, sym
->proc
.name
, sym
->proc
.namelen
);
2131 new_addr
.type
= DEBUG_GetCVType(sym
->proc
.proctype
);
2132 new_addr
.off
= (unsigned int) deefer
->load_addr
+
2133 sectp
[sym
->proc
.segment
- 1].VirtualAddress
+
2136 * See if we can find a segment that this goes with. If so,
2137 * it means that we also may have line number information
2138 * for this function.
2140 for(i
=0; linetab
[i
].linetab
!= NULL
; i
++)
2142 if( ((unsigned int) deefer
->load_addr
2143 + sectp
[linetab
[i
].segno
- 1].VirtualAddress
2144 + linetab
[i
].start
<= new_addr
.off
)
2145 && ((unsigned int) deefer
->load_addr
2146 + sectp
[linetab
[i
].segno
- 1].VirtualAddress
2147 + linetab
[i
].end
> new_addr
.off
) )
2153 DEBUG_Normalize(curr_func
);
2154 if( linetab
[i
].linetab
== NULL
)
2156 curr_func
= DEBUG_AddSymbol( symname
, &new_addr
, NULL
,
2157 SYM_WIN32
| SYM_FUNC
);
2162 * First, create the entry. Then dig through the linetab
2163 * and add whatever line numbers are appropriate for this
2166 curr_func
= DEBUG_AddSymbol( symname
, &new_addr
,
2167 linetab
[i
].sourcefile
,
2168 SYM_WIN32
| SYM_FUNC
);
2169 for(j
=0; j
< linetab
[i
].nline
; j
++)
2171 if( linetab
[i
].offtab
[j
] >= sym
->proc
.offset
2172 && linetab
[i
].offtab
[j
] < sym
->proc
.offset
2173 + sym
->proc
.proc_len
)
2175 DEBUG_AddLineNumber(curr_func
, linetab
[i
].linetab
[j
],
2176 linetab
[i
].offtab
[j
] - sym
->proc
.offset
);
2183 * Add information about where we should set breakpoints
2186 DEBUG_SetSymbolBPOff(curr_func
, sym
->proc
.debug_start
);
2187 DEBUG_SetSymbolSize(curr_func
, sym
->proc
.proc_len
);
2192 * Global and static functions.
2194 memcpy(symname
, sym
->proc32
.name
, sym
->proc32
.namelen
);
2196 new_addr
.type
= DEBUG_GetCVType(sym
->proc32
.proctype
);
2197 new_addr
.off
= (unsigned int) deefer
->load_addr
+
2198 sectp
[sym
->proc32
.segment
- 1].VirtualAddress
+
2201 * See if we can find a segment that this goes with. If so,
2202 * it means that we also may have line number information
2203 * for this function.
2205 for(i
=0; linetab
[i
].linetab
!= NULL
; i
++)
2207 if( ((unsigned int) deefer
->load_addr
2208 + sectp
[linetab
[i
].segno
- 1].VirtualAddress
2209 + linetab
[i
].start
<= new_addr
.off
)
2210 && ((unsigned int) deefer
->load_addr
2211 + sectp
[linetab
[i
].segno
- 1].VirtualAddress
2212 + linetab
[i
].end
> new_addr
.off
) )
2218 DEBUG_Normalize(curr_func
);
2219 if( linetab
[i
].linetab
== NULL
)
2221 curr_func
= DEBUG_AddSymbol( symname
, &new_addr
, NULL
,
2222 SYM_WIN32
| SYM_FUNC
);
2227 * First, create the entry. Then dig through the linetab
2228 * and add whatever line numbers are appropriate for this
2231 curr_func
= DEBUG_AddSymbol( symname
, &new_addr
,
2232 linetab
[i
].sourcefile
,
2233 SYM_WIN32
| SYM_FUNC
);
2234 for(j
=0; j
< linetab
[i
].nline
; j
++)
2236 if( linetab
[i
].offtab
[j
] >= sym
->proc32
.offset
2237 && linetab
[i
].offtab
[j
] < sym
->proc32
.offset
2238 + sym
->proc32
.proc_len
)
2240 DEBUG_AddLineNumber(curr_func
, linetab
[i
].linetab
[j
],
2241 linetab
[i
].offtab
[j
] - sym
->proc32
.offset
);
2248 * Add information about where we should set breakpoints
2251 DEBUG_SetSymbolBPOff(curr_func
, sym
->proc32
.debug_start
);
2252 DEBUG_SetSymbolSize(curr_func
, sym
->proc32
.proc_len
);
2256 * Function parameters and stack variables.
2258 memcpy(symname
, sym
->stack
.name
, sym
->stack
.namelen
);
2259 curr_sym
= DEBUG_AddLocal(curr_func
,
2265 DEBUG_SetLocalSymbolType(curr_sym
, DEBUG_GetCVType(sym
->stack
.symtype
));
2270 * Function parameters and stack variables.
2272 memcpy(symname
, sym
->stack32
.name
, sym
->stack32
.namelen
);
2273 curr_sym
= DEBUG_AddLocal(curr_func
,
2275 sym
->stack32
.offset
,
2279 DEBUG_SetLocalSymbolType(curr_sym
, DEBUG_GetCVType(sym
->stack32
.symtype
));
2287 * Adjust pointer to point to next entry, rounding up to a word
2288 * boundary. MS preserving alignment? Stranger things have
2291 if( sym
->generic
.id
== S_PROCREF
2292 || sym
->generic
.id
== S_DATAREF
2293 || sym
->generic
.id
== S_LPROCREF
)
2295 len
= (sym
->generic
.len
+ 3) & ~3;
2296 len
+= ptr
.c
[16] + 1;
2297 ptr
.c
+= (len
+ 3) & ~3;
2301 ptr
.c
+= (sym
->generic
.len
+ 3) & ~3;
2305 if( linetab
!= NULL
)
2315 * Process PDB file which contains debug information.
2319 typedef struct _PDB_FILE
2324 } PDB_FILE
, *PPDB_FILE
;
2326 typedef struct _PDB_HEADER
2334 WORD toc_block
[ 1 ];
2336 } PDB_HEADER
, *PPDB_HEADER
;
2338 typedef struct _PDB_TOC
2343 } PDB_TOC
, *PPDB_TOC
;
2345 typedef struct _PDB_ROOT
2348 DWORD TimeDateStamp
;
2353 } PDB_ROOT
, *PPDB_ROOT
;
2355 typedef struct _PDB_TYPES_OLD
2364 } PDB_TYPES_OLD
, *PPDB_TYPES_OLD
;
2366 typedef struct _PDB_TYPES
2379 DWORD search_offset
;
2381 DWORD unknown_offset
;
2384 } PDB_TYPES
, *PPDB_TYPES
;
2386 typedef struct _PDB_SYMBOL_RANGE
2392 DWORD characteristics
;
2396 } PDB_SYMBOL_RANGE
, *PPDB_SYMBOL_RANGE
;
2398 typedef struct _PDB_SYMBOL_RANGE_EX
2404 DWORD characteristics
;
2410 } PDB_SYMBOL_RANGE_EX
, *PPDB_SYMBOL_RANGE_EX
;
2412 typedef struct _PDB_SYMBOL_FILE
2415 PDB_SYMBOL_RANGE range
;
2425 } PDB_SYMBOL_FILE
, *PPDB_SYMBOL_FILE
;
2427 typedef struct _PDB_SYMBOL_FILE_EX
2430 PDB_SYMBOL_RANGE_EX range
;
2438 DWORD reserved
[ 2 ];
2441 } PDB_SYMBOL_FILE_EX
, *PPDB_SYMBOL_FILE_EX
;
2443 typedef struct _PDB_SYMBOL_SOURCE
2449 } PDB_SYMBOL_SOURCE
, *PPDB_SYMBOL_SOURCE
;
2451 typedef struct _PDB_SYMBOL_IMPORT
2455 DWORD TimeDateStamp
;
2459 } PDB_SYMBOL_IMPORT
, *PPDB_SYMBOL_IMPORT
;
2461 typedef struct _PDB_SYMBOLS_OLD
2470 DWORD srcmodule_size
;
2472 } PDB_SYMBOLS_OLD
, *PPDB_SYMBOLS_OLD
;
2474 typedef struct _PDB_SYMBOLS
2478 DWORD extended_format
;
2485 DWORD srcmodule_size
;
2486 DWORD pdbimport_size
;
2489 } PDB_SYMBOLS
, *PPDB_SYMBOLS
;
2493 static void *pdb_read( LPBYTE image
, WORD
*block_list
, int size
)
2495 PPDB_HEADER pdb
= (PPDB_HEADER
)image
;
2499 if ( !size
) return NULL
;
2501 nBlocks
= (size
+ pdb
->blocksize
-1) / pdb
->blocksize
;
2502 buffer
= DBG_alloc( nBlocks
* pdb
->blocksize
);
2504 for ( i
= 0; i
< nBlocks
; i
++ )
2505 memcpy( buffer
+ i
*pdb
->blocksize
,
2506 image
+ block_list
[i
]*pdb
->blocksize
, pdb
->blocksize
);
2511 static void *pdb_read_file( LPBYTE image
, PPDB_TOC toc
, int fileNr
)
2513 PPDB_HEADER pdb
= (PPDB_HEADER
)image
;
2517 if ( !toc
|| fileNr
>= toc
->nFiles
)
2520 block_list
= (WORD
*) &toc
->file
[ toc
->nFiles
];
2521 for ( i
= 0; i
< fileNr
; i
++ )
2522 block_list
+= (toc
->file
[i
].size
+ pdb
->blocksize
-1) / pdb
->blocksize
;
2524 return pdb_read( image
, block_list
, toc
->file
[fileNr
].size
);
2527 static void pdb_free( void *buffer
)
2532 static void pdb_convert_types_header( PDB_TYPES
*types
, char *image
)
2534 memset( types
, 0, sizeof(PDB_TYPES
) );
2535 if ( !image
) return;
2537 if ( *(DWORD
*)image
< 19960000 ) /* FIXME: correct version? */
2539 /* Old version of the types record header */
2540 PDB_TYPES_OLD
*old
= (PDB_TYPES_OLD
*)image
;
2541 types
->version
= old
->version
;
2542 types
->type_offset
= sizeof(PDB_TYPES_OLD
);
2543 types
->type_size
= old
->type_size
;
2544 types
->first_index
= old
->first_index
;
2545 types
->last_index
= old
->last_index
;
2546 types
->file
= old
->file
;
2550 /* New version of the types record header */
2551 *types
= *(PDB_TYPES
*)image
;
2555 static void pdb_convert_symbols_header( PDB_SYMBOLS
*symbols
,
2556 int *header_size
, char *image
)
2558 memset( symbols
, 0, sizeof(PDB_SYMBOLS
) );
2559 if ( !image
) return;
2561 if ( *(DWORD
*)image
!= 0xffffffff )
2563 /* Old version of the symbols record header */
2564 PDB_SYMBOLS_OLD
*old
= (PDB_SYMBOLS_OLD
*)image
;
2565 symbols
->version
= 0;
2566 symbols
->extended_format
= 0;
2567 symbols
->module_size
= old
->module_size
;
2568 symbols
->offset_size
= old
->offset_size
;
2569 symbols
->hash_size
= old
->hash_size
;
2570 symbols
->srcmodule_size
= old
->srcmodule_size
;
2571 symbols
->pdbimport_size
= 0;
2572 symbols
->hash1_file
= old
->hash1_file
;
2573 symbols
->hash2_file
= old
->hash2_file
;
2574 symbols
->gsym_file
= old
->gsym_file
;
2576 *header_size
= sizeof(PDB_SYMBOLS_OLD
);
2580 /* New version of the symbols record header */
2581 *symbols
= *(PDB_SYMBOLS
*)image
;
2583 *header_size
= sizeof(PDB_SYMBOLS
);
2587 int DEBUG_ProcessPDBFile( struct deferred_debug_info
*deefer
, char *full_filename
)
2589 char filename
[MAX_PATHNAME_LEN
];
2590 struct stat statbuf
;
2592 char *image
= (char *) 0xffffffff;
2593 PDB_HEADER
*pdb
= NULL
;
2594 PDB_TOC
*toc
= NULL
;
2595 PDB_ROOT
*root
= NULL
;
2596 char *types_image
= NULL
;
2597 char *symbols_image
= NULL
;
2599 PDB_SYMBOLS symbols
;
2600 int header_size
= 0;
2601 char *modimage
, *file
;
2605 * Open and mmap() .PDB file
2608 LocateDebugInfoFile( full_filename
, filename
);
2610 if ( stat( filename
, &statbuf
) == -1 )
2612 fprintf( stderr
, "-Unable to open .PDB file %s\n", filename
);
2616 fd
= open(filename
, O_RDONLY
);
2619 fprintf( stderr
, "-Unable to open .PDB file %s\n", filename
);
2623 image
= mmap( 0, statbuf
.st_size
, PROT_READ
, MAP_PRIVATE
, fd
, 0 );
2624 if ( image
== (char *) 0xffffffff )
2626 fprintf(stderr
, "-Unable to mmap .PDB file %s\n", filename
);
2631 * Read in TOC and well-known files
2634 pdb
= (PPDB_HEADER
)image
;
2635 toc
= pdb_read( image
, pdb
->toc_block
, pdb
->toc
.size
);
2636 root
= pdb_read_file( image
, toc
, 1 );
2637 types_image
= pdb_read_file( image
, toc
, 2 );
2638 symbols_image
= pdb_read_file( image
, toc
, 3 );
2640 pdb_convert_types_header( &types
, types_image
);
2641 pdb_convert_symbols_header( &symbols
, &header_size
, symbols_image
);
2644 * Check for unknown versions
2647 switch ( root
->version
)
2649 case 19950623: /* VC 4.0 */
2651 case 19960307: /* VC 5.0 */
2652 case 19970604: /* VC 6.0 */
2655 fprintf( stderr
, "-Unknown root block version %ld\n", root
->version
);
2658 switch ( types
.version
)
2660 case 19950410: /* VC 4.0 */
2662 case 19961031: /* VC 5.0 / 6.0 */
2665 fprintf( stderr
, "-Unknown type info version %ld\n", types
.version
);
2668 switch ( symbols
.version
)
2670 case 0: /* VC 4.0 */
2671 case 19960307: /* VC 5.0 */
2672 case 19970606: /* VC 6.0 */
2675 fprintf( stderr
, "-Unknown symbol info version %ld\n", symbols
.version
);
2680 * Check .PDB time stamp
2683 if ( root
->TimeDateStamp
2684 != ((struct CodeViewDebug
*)deefer
->dbg_info
)->cv_timestamp
)
2686 fprintf(stderr
, "-Wrong time stamp of .PDB file %s\n", filename
);
2694 DEBUG_ParseTypeTable( types_image
+ types
.type_offset
, types
.type_size
);
2697 * Read type-server .PDB imports
2700 if ( symbols
.pdbimport_size
)
2703 fprintf(stderr
, "-Type server .PDB imports ignored!\n" );
2707 * Read global symbol table
2710 modimage
= pdb_read_file( image
, toc
, symbols
.gsym_file
);
2713 DEBUG_SnarfCodeView( deefer
, modimage
,
2714 toc
->file
[symbols
.gsym_file
].size
, NULL
);
2715 pdb_free( modimage
);
2719 * Read per-module symbol / linenumber tables
2722 file
= symbols_image
+ header_size
;
2723 while ( file
- symbols_image
< header_size
+ symbols
.module_size
)
2725 int file_nr
, file_index
, symbol_size
, lineno_size
;
2728 if ( !symbols
.extended_format
)
2730 PDB_SYMBOL_FILE
*sym_file
= (PDB_SYMBOL_FILE
*) file
;
2731 file_nr
= sym_file
->file
;
2732 file_name
= sym_file
->filename
;
2733 file_index
= sym_file
->range
.index
;
2734 symbol_size
= sym_file
->symbol_size
;
2735 lineno_size
= sym_file
->lineno_size
;
2739 PDB_SYMBOL_FILE_EX
*sym_file
= (PDB_SYMBOL_FILE_EX
*) file
;
2740 file_nr
= sym_file
->file
;
2741 file_name
= sym_file
->filename
;
2742 file_index
= sym_file
->range
.index
;
2743 symbol_size
= sym_file
->symbol_size
;
2744 lineno_size
= sym_file
->lineno_size
;
2747 modimage
= pdb_read_file( image
, toc
, file_nr
);
2750 struct codeview_linetab_hdr
*linetab
= NULL
;
2753 linetab
= DEBUG_SnarfLinetab( modimage
+ symbol_size
, lineno_size
);
2756 DEBUG_SnarfCodeView( deefer
, modimage
+ sizeof(DWORD
),
2757 symbol_size
- sizeof(DWORD
), linetab
);
2759 pdb_free( modimage
);
2762 file_name
+= strlen(file_name
) + 1;
2763 file
= (char *)( (DWORD
)(file_name
+ strlen(file_name
) + 1 + 3) & ~3 );
2773 if ( symbols_image
) pdb_free( symbols_image
);
2774 if ( types_image
) pdb_free( types_image
);
2775 if ( root
) pdb_free( root
);
2776 if ( toc
) pdb_free( toc
);
2778 if ( image
!= (char *) 0xffffffff ) munmap( image
, statbuf
.st_size
);
2779 if ( fd
!= -1 ) close( fd
);
2786 * Process DBG file which contains debug information.
2790 DEBUG_ProcessDBGFile(struct deferred_debug_info
* deefer
, char * filename
)
2792 char * addr
= (char *) 0xffffffff;
2794 struct CV4_DirHead
* codeview_dir
;
2795 struct CV4_DirEnt
* codeview_dent
;
2796 PIMAGE_DEBUG_DIRECTORY dbghdr
;
2797 struct deferred_debug_info deefer2
;
2801 struct codeview_linetab_hdr
* linetab
;
2803 PIMAGE_SEPARATE_DEBUG_HEADER pdbg
= NULL
;
2804 IMAGE_SECTION_HEADER
* sectp
;
2805 struct stat statbuf
;
2807 char dbg_file
[MAX_PATHNAME_LEN
];
2809 LocateDebugInfoFile(filename
, dbg_file
);
2810 status
= stat(dbg_file
, &statbuf
);
2813 fprintf(stderr
, "-Unable to open .DBG file %s\n", dbg_file
);
2818 * Now open the file, so that we can mmap() it.
2820 fd
= open(dbg_file
, O_RDONLY
);
2823 fprintf(stderr
, "Unable to open .DBG file %s\n", dbg_file
);
2829 * Now mmap() the file.
2831 addr
= mmap(0, statbuf
.st_size
, PROT_READ
,
2832 MAP_PRIVATE
, fd
, 0);
2833 if( addr
== (char *) 0xffffffff )
2835 fprintf(stderr
, "Unable to mmap .DBG file %s\n", dbg_file
);
2839 pdbg
= (PIMAGE_SEPARATE_DEBUG_HEADER
) addr
;
2841 if( pdbg
->TimeDateStamp
!= deefer
->dbgdir
->TimeDateStamp
)
2843 fprintf(stderr
, "Warning - %s has incorrect internal timestamp\n",
2847 Well, sometimes this happens to DBG files which ARE REALLY the right .DBG
2848 files but nonetheless this check fails. Anyway, WINDBG (debugger for
2849 Windows by Microsoft) loads debug symbols which have incorrect timestamps.
2853 fprintf(stderr
, "Processing symbols from %s...\n", dbg_file
);
2855 dbghdr
= (PIMAGE_DEBUG_DIRECTORY
) ( addr
+ sizeof(*pdbg
)
2856 + pdbg
->NumberOfSections
* sizeof(IMAGE_SECTION_HEADER
)
2857 + pdbg
->ExportedNamesSize
);
2859 sectp
= (PIMAGE_SECTION_HEADER
) ((char *) pdbg
+ sizeof(*pdbg
));
2860 nsect
= pdbg
->NumberOfSections
;
2862 for( i
=0; i
< pdbg
->DebugDirectorySize
/ sizeof(*pdbg
); i
++, dbghdr
++ )
2864 switch(dbghdr
->Type
)
2866 case IMAGE_DEBUG_TYPE_COFF
:
2868 * Dummy up a deferred debug header to handle the
2869 * COFF stuff embedded within the DBG file.
2871 memset((char *) &deefer2
, 0, sizeof(deefer2
));
2872 deefer2
.dbg_info
= (addr
+ dbghdr
->PointerToRawData
);
2873 deefer2
.dbg_size
= dbghdr
->SizeOfData
;
2874 deefer2
.load_addr
= deefer
->load_addr
;
2876 DEBUG_ProcessCoff(&deefer2
);
2878 case IMAGE_DEBUG_TYPE_CODEVIEW
:
2880 * This is the older format by which codeview stuff is
2881 * stored, known as the 'NB09' format. Newer executables
2882 * and dlls created by VC++ use PDB files instead, which
2883 * have lots of internal similarities, but the overall
2884 * format and structure is quite different.
2886 codeview
= (addr
+ dbghdr
->PointerToRawData
);
2889 * The first thing in the codeview section should be
2890 * an 'NB09' identifier. As a sanity check, make sure
2893 if( *((unsigned int*) codeview
) != 0x3930424e )
2899 * Next we need to find the directory. This is easy too.
2901 codeview_dir
= (struct CV4_DirHead
*)
2902 (codeview
+ ((unsigned int*) codeview
)[1]);
2905 * Some more sanity checks. Make sure that everything
2906 * is as we expect it.
2908 if( codeview_dir
->next_offset
!= 0
2909 || codeview_dir
->dhsize
!= sizeof(*codeview_dir
)
2910 || codeview_dir
->desize
!= sizeof(*codeview_dent
) )
2914 codeview_dent
= (struct CV4_DirEnt
*) (codeview_dir
+ 1);
2916 for(j
=0; j
< codeview_dir
->ndir
; j
++, codeview_dent
++)
2918 if( codeview_dent
->subsect_number
== sstAlignSym
)
2921 * Check the previous entry. If it is a
2922 * sstSrcModule, it contains the line number
2923 * info for this file.
2926 if( codeview_dent
[1].module_number
== codeview_dent
[0].module_number
2927 && codeview_dent
[1].subsect_number
== sstSrcModule
)
2929 linetab
= DEBUG_SnarfLinetab(
2930 codeview
+ codeview_dent
[1].offset
,
2931 codeview_dent
[1].size
);
2934 if( codeview_dent
[-1].module_number
== codeview_dent
[0].module_number
2935 && codeview_dent
[-1].subsect_number
== sstSrcModule
)
2937 linetab
= DEBUG_SnarfLinetab(
2938 codeview
+ codeview_dent
[-1].offset
,
2939 codeview_dent
[-1].size
);
2942 * Now process the CV stuff.
2944 DEBUG_SnarfCodeView(deefer
,
2945 codeview
+ codeview_dent
->offset
+ sizeof(DWORD
),
2946 codeview_dent
->size
- sizeof(DWORD
),
2958 if( addr
!= (char *) 0xffffffff )
2960 munmap(addr
, statbuf
.st_size
);
2972 DEBUG_ProcessDeferredDebug()
2974 struct deferred_debug_info
* deefer
;
2975 struct CodeViewDebug
* cvd
;
2976 struct MiscDebug
* misc
;
2982 for(deefer
= dbglist
; deefer
; deefer
= deefer
->next
)
2984 if( deefer
->status
!= DF_STATUS_NEW
)
2989 if( last_proc
!= deefer
->dbg_index
)
2993 fprintf(stderr
, "DeferredDebug for:");
2996 fprintf(stderr
, " %s",deefer
->module_name
);
2997 last_proc
= deefer
->dbg_index
;
3000 switch(deefer
->dbgdir
->Type
)
3002 case IMAGE_DEBUG_TYPE_COFF
:
3004 * Standard COFF debug information that VC++ adds when you
3005 * use /debugtype:both with the linker.
3008 fprintf(stderr
, "Processing COFF symbols...\n");
3010 sts
= DEBUG_ProcessCoff(deefer
);
3012 case IMAGE_DEBUG_TYPE_CODEVIEW
:
3014 * This is a pointer to a PDB file of some sort.
3016 cvd
= (struct CodeViewDebug
*) deefer
->dbg_info
;
3018 if( strcmp(cvd
->cv_nbtype
, "NB10") != 0 )
3021 * Whatever this is, we don't know how to deal with
3027 sts
= DEBUG_ProcessPDBFile(deefer
, cvd
->cv_name
);
3029 fprintf(stderr
, "Processing PDB file %s\n", cvd
->cv_name
);
3032 case IMAGE_DEBUG_TYPE_MISC
:
3034 * A pointer to a .DBG file of some sort. These files
3035 * can contain either CV4 or COFF information. Open
3036 * the file, and try to do the right thing with it.
3038 misc
= (struct MiscDebug
*) deefer
->dbg_info
;
3040 filename
= strrchr((char *) &misc
->Data
, '.');
3043 * Ignore the file if it doesn't have a .DBG extension.
3045 if( (filename
== NULL
)
3046 || ( (strcmp(filename
, ".dbg") != 0)
3047 && (strcmp(filename
, ".DBG") != 0)) )
3053 filename
= (char *) &misc
->Data
;
3056 * Do the dirty deed...
3058 sts
= DEBUG_ProcessDBGFile(deefer
, filename
);
3063 * We should never get here...
3068 deefer
->status
= (sts
) ? DF_STATUS_LOADED
: DF_STATUS_ERROR
;
3072 fprintf(stderr
, "\n");
3077 /***********************************************************************
3080 * Display shared libarary information.
3082 void DEBUG_InfoShare(void)
3084 struct deferred_debug_info
* deefer
;
3086 fprintf(stderr
,"Address\t\tModule\tName\n");
3088 for(deefer
= dbglist
; deefer
; deefer
= deefer
->next
)
3090 fprintf(stderr
,"0x%8.8x\t(%s)\t%s\n", (unsigned int) deefer
->load_addr
,
3091 deefer
->module
? "Win32" : "ELF", deefer
->module_name
);