2 * File msc.c - read VC++ debug information from COFF and eventually
5 * Copyright (C) 1996, Eric Youngdale.
7 * Note - this handles reading debug information for 32 bit applications
8 * that run under Windows-NT for example. I doubt that this would work well
9 * for 16 bit applications, but I don't think it really matters since the
10 * file format is different, and we should never get in here in such cases.
13 * Get 16 bit CV stuff working.
14 * Add symbol size to internal symbol table.
21 #include <sys/types.h>
29 #define PATH_MAX _MAX_PATH
37 *dbg_filename must be at least MAX_PATHNAME_LEN bytes in size
39 static void LocateDebugInfoFile(char *filename, char *dbg_filename)
41 char *str1 = DBG_alloc(MAX_PATHNAME_LEN*10);
42 char *str2 = DBG_alloc(MAX_PATHNAME_LEN);
45 DOS_FULL_NAME fullname;
47 file = strrchr(filename, '\\');
48 if( file == NULL ) file = filename; else file++;
50 if (GetEnvironmentVariableA("_NT_SYMBOL_PATH", str1, MAX_PATHNAME_LEN))
51 if (SearchPathA(str1, file, NULL, MAX_PATHNAME_LEN*10, str2, &name_part))
53 if (GetEnvironmentVariableA("_NT_ALT_SYMBOL_PATH", str1, MAX_PATHNAME_LEN))
54 if (SearchPathA(str1, file, NULL, MAX_PATHNAME_LEN*10, str2, &name_part))
56 if (SearchPathA(NULL, file, NULL, MAX_PATHNAME_LEN*10, str2, &name_part))
61 memcpy(dbg_filename, filename, MAX_PATHNAME_LEN);
67 if (DOSFS_GetFullName(str2, TRUE, &fullname))
68 memcpy(dbg_filename, fullname.long_name, MAX_PATHNAME_LEN);
76 * This is an index we use to keep track of the debug information
77 * when we have multiple sources. We use the same database to also
78 * allow us to do an 'info shared' type of deal, and we use the index
79 * to eliminate duplicates.
81 static int DEBUG_next_index = 0;
92 * This is a convenience structure used to map portions of the
102 * This is how we reference the various record types.
104 union codeview_symbol
118 unsigned short symtype;
119 unsigned char namelen;
120 unsigned char name[1];
127 unsigned int pparent;
131 unsigned short segment;
132 unsigned short thunk_len;
133 unsigned char thtype;
134 unsigned char namelen;
135 unsigned char name[1];
141 unsigned int pparent;
144 unsigned int proc_len;
145 unsigned int debug_start;
146 unsigned int debug_end;
148 unsigned short segment;
149 unsigned short proctype;
151 unsigned char namelen;
152 unsigned char name[1];
156 short int len; /* Total length of this entry */
157 short int id; /* Always S_BPREL32 */
158 unsigned int offset; /* Stack offset relative to BP */
159 unsigned short symtype;
160 unsigned char namelen;
161 unsigned char name[1];
179 unsigned char variant[1];
187 unsigned char bitoff;
197 unsigned char arrlen;
198 unsigned char namelen;
199 unsigned char name[1];
211 unsigned short structlen;
212 unsigned char namelen;
213 unsigned char name[1];
223 unsigned short un_len;
224 unsigned char namelen;
225 unsigned char name[1];
236 unsigned char namelen;
237 unsigned char name[1];
244 unsigned short int value;
245 unsigned char namelen;
246 unsigned char name[1];
254 unsigned short int offset;
255 unsigned char namelen;
256 unsigned char name[1];
267 unsigned char namelen;
268 unsigned char name[1];
273 #define S_BPREL 0x200
274 #define S_LDATA 0x201
275 #define S_GDATA 0x202
277 #define S_LPROC 0x204
278 #define S_GPROC 0x205
279 #define S_THUNK 0x206
280 #define S_BLOCK 0x207
282 #define S_LABEL 0x209
284 #define S_PROCREF 0x400
285 #define S_DATAREF 0x401
286 #define S_ALIGN 0x402
287 #define S_UNKNOWN 0x403
290 * This covers the basic datatypes that VC++ seems to be using these days.
291 * 32 bit mode only. There are additional numbers for the pointers in 16
292 * bit mode. There are many other types listed in the documents, but these
293 * are apparently not used by the compiler, or represent pointer types
296 #define T_NOTYPE 0x0000 /* Notype */
297 #define T_ABS 0x0001 /* Abs */
298 #define T_VOID 0x0003 /* Void */
299 #define T_CHAR 0x0010 /* signed char */
300 #define T_SHORT 0x0011 /* short */
301 #define T_LONG 0x0012 /* long */
302 #define T_QUAD 0x0013 /* long long */
303 #define T_UCHAR 0x0020 /* unsigned char */
304 #define T_USHORT 0x0021 /* unsigned short */
305 #define T_ULONG 0x0022 /* unsigned long */
306 #define T_UQUAD 0x0023 /* unsigned long long */
307 #define T_REAL32 0x0040 /* float */
308 #define T_REAL64 0x0041 /* double */
309 #define T_RCHAR 0x0070 /* real char */
310 #define T_WCHAR 0x0071 /* wide char */
311 #define T_INT4 0x0074 /* int */
312 #define T_UINT4 0x0075 /* unsigned int */
314 #define T_32PVOID 0x0403 /* 32 bit near pointer to void */
315 #define T_32PCHAR 0x0410 /* 16:32 near pointer to signed char */
316 #define T_32PSHORT 0x0411 /* 16:32 near pointer to short */
317 #define T_32PLONG 0x0412 /* 16:32 near pointer to int */
318 #define T_32PQUAD 0x0413 /* 16:32 near pointer to long long */
319 #define T_32PUCHAR 0x0420 /* 16:32 near pointer to unsigned char */
320 #define T_32PUSHORT 0x0421 /* 16:32 near pointer to unsigned short */
321 #define T_32PULONG 0x0422 /* 16:32 near pointer to unsigned int */
322 #define T_32PUQUAD 0x0423 /* 16:32 near pointer to long long */
323 #define T_32PREAL32 0x0440 /* 16:32 near pointer to float */
324 #define T_32PREAL64 0x0441 /* 16:32 near pointer to float */
325 #define T_32PRCHAR 0x0470 /* 16:32 near pointer to real char */
326 #define T_32PWCHAR 0x0471 /* 16:32 near pointer to real char */
327 #define T_32PINT4 0x0474 /* 16:32 near pointer to int */
328 #define T_32PUINT4 0x0475 /* 16:32 near pointer to unsigned int */
330 #define LF_MODIFIER 0x1
331 #define LF_POINTER 0x2
334 #define LF_STRUCTURE 0x5
336 #define LF_ENUMERATION 0x7
337 #define LF_PROCEDURE 0x8
338 #define LF_MFUNCTION 0x9
339 #define LF_VTSHAPE 0xa
340 #define LF_BARRAY 0xd
341 #define LF_DIMARRAY 0x11
342 #define LF_VFTPATH 0x12
344 #define LF_SKIP 0x200
345 #define LF_ARGLIST 0x201
346 #define LF_FIELDLIST 0x204
347 #define LF_DERIVED 0x205
348 #define LF_BITFIELD 0x206
350 #define LF_BCLASS 0x400
351 #define LF_VBCLASS 0x401
352 #define LF_IVBCLASS 0x402
353 #define LF_ENUMERATE 0x403
354 #define LF_FRIENDFCN 0x404
355 #define LF_INDEX 0x405
356 #define LF_MEMBER 0x406
357 #define LF_STMEMBER 0x407
358 #define LF_METHOD 0x408
359 #define LF_NESTEDTYPE 0x409
360 #define LF_VFUNCTAB 0x40a
361 #define LF_FRIENDCLS 0x40b
362 #define LF_ONEMETHOD 0x40c
363 #define LF_FUNCOFF 0x40d
365 #define MAX_BUILTIN_TYPES 0x480
366 static struct datatype * cv_basic_types[MAX_BUILTIN_TYPES];
367 static int num_cv_defined_types = 0;
368 static struct datatype **cv_defined_types = NULL;
371 * For the type CODEVIEW debug directory entries, the debug directory
372 * points to a structure like this. The cv_name field is the name
373 * of an external .PDB file.
378 unsigned int cv_timestamp;
384 unsigned int DataType;
392 * This is the header that the COFF variety of debug header points to.
396 unsigned int SymbolOffset;
397 unsigned int N_Linenum;
398 unsigned int LinenumberOffset;
399 unsigned int Unused[4];
403 unsigned int VirtualAddr;
404 unsigned short int Linenum;
408 unsigned int startaddr;
409 unsigned int endaddr;
413 struct name_hash **entries;
423 unsigned int NotLong;
424 unsigned int StrTaboff;
431 unsigned char NumberOfAuxSymbols;
434 struct CoffAuxSection{
436 unsigned short NumberOfRelocations;
437 unsigned short NumberOfLinenumbers;
438 unsigned int CheckSum;
444 * These two structures are used in the directory within a .DBG file
445 * to locate the individual important bits that we might want to see.
448 short unsigned int dhsize;
449 short unsigned int desize;
451 unsigned int next_offset;
456 short unsigned int subsect_number;
457 short unsigned int module_number;
463 * These are the values of interest that the subsect_number field takes.
465 #define sstAlignSym 0x125
466 #define sstSrcModule 0x127
468 struct codeview_linetab_hdr
475 unsigned short * linetab;
476 unsigned int * offtab;
479 struct codeview_pdb_hdr
482 unsigned int blocksize; /* Extent size */
483 unsigned short loc_freelist; /* freelist. */
484 unsigned short alloc_filesize; /* # extents allocated. */
485 unsigned int toc_len;
486 unsigned int unknown;
487 unsigned short toc_ext[1]; /* array of extent #'s for toc. */
491 * This is our own structure that we use to keep track of the contents
498 short int * extent_list;
499 unsigned int linetab_offset;
500 unsigned int linetab_len;
504 * These are the structures that represent how the file table is set up
505 * within the PDB file.
509 unsigned short tab1_file;
510 unsigned short tab2_file;
511 unsigned short gsym_file;
512 unsigned short padding;
513 unsigned int ftab_len;
514 unsigned int fofftab_len;
515 unsigned int hash_len;
516 unsigned int strtab_len;
521 unsigned int reserved1;
522 unsigned short datasect_segment;
523 unsigned short reserved2;
524 unsigned int datasect_offset;
525 unsigned int datasect_size;
526 unsigned int datasect_flags;
527 unsigned short reserved3;
528 unsigned short index;
529 unsigned short num6a;
530 unsigned short file_number;
531 unsigned int linetab_offset;
532 unsigned int linetab_len;
536 unsigned char filename[1];
540 ********************************************************************
542 struct deferred_debug_info
544 struct deferred_debug_info * next;
550 PIMAGE_DEBUG_DIRECTORY dbgdir;
551 PIMAGE_SECTION_HEADER sectp;
557 struct deferred_debug_info * dbglist = NULL;
560 * A simple macro that tells us whether a given COFF symbol is a
563 #define N_TMASK 0x0030
564 #define IMAGE_SYM_DTYPE_FUNCTION 2
566 #define ISFCN(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_FUNCTION << N_BTSHFT))
570 * This is what we are looking for in the COFF symbols.
572 #define IMAGE_SYM_CLASS_EXTERNAL 0x2
573 #define IMAGE_SYM_CLASS_STATIC 0x3
574 #define IMAGE_SYM_CLASS_FILE 0x67
577 struct datatype * DEBUG_GetCVType(int typeno)
579 struct datatype * dt = NULL;
582 * Convert Codeview type numbers into something we can grok internally.
583 * Numbers < 0x1000 are all fixed builtin types. Numbers from 0x1000 and
584 * up are all user defined (structs, etc).
586 if( typeno < 0x1000 )
588 if( typeno < MAX_BUILTIN_TYPES )
590 dt = cv_basic_types[typeno];
595 if( typeno - 0x1000 < num_cv_defined_types )
597 dt = cv_defined_types[typeno - 0x1000];
605 DEBUG_ParseTypeTable(char * table, int len)
609 enum debug_type fieldtype;
613 struct datatype * subtype;
615 union codeview_type * type;
616 union codeview_type * type2;
617 struct datatype * typeptr;
621 ptr.c = (table + 16);
622 while( ptr.c - table < len )
624 type = (union codeview_type *) ptr.c;
626 if( curr_type - 0x1000 >= num_cv_defined_types )
628 num_cv_defined_types += 0x100;
629 cv_defined_types = (struct datatype **) DBG_realloc(cv_defined_types,
630 num_cv_defined_types * sizeof(struct datatype *));
631 memset(cv_defined_types + num_cv_defined_types - 0x100,
633 0x100 * sizeof(struct datatype *));
634 if( cv_defined_types == NULL )
640 switch(type->generic.id)
643 cv_defined_types[curr_type - 0x1000] =
644 DEBUG_FindOrMakePointerType(DEBUG_GetCVType(type->pointer.datatype));
647 if( type->array.arrlen >= 0x8000 )
650 * This is a numeric leaf, I am too lazy to handle this right
653 fprintf(stderr, "Ignoring large numberic leaf.\n");
656 if( type->array.namelen != 0 )
658 memset(symname, 0, sizeof(symname));
659 memcpy(symname, type->array.name, type->array.namelen);
660 typeptr = DEBUG_NewDataType(DT_ARRAY, symname);
664 typeptr = DEBUG_NewDataType(DT_ARRAY, NULL);
666 cv_defined_types[curr_type - 0x1000] = typeptr;
668 subtype = DEBUG_GetCVType(type->array.elemtype);
669 if( (subtype == NULL)
670 || (elem_size = DEBUG_GetObjectSize(subtype)) == 0 )
676 arr_max = type->array.arrlen / DEBUG_GetObjectSize(subtype);
679 DEBUG_SetArrayParams(typeptr, 0, arr_max, subtype);
683 * This is where the basic list of fields is defined for
684 * structures and classes.
686 * First, we need to look ahead and see whether we are building
687 * a fieldlist for an enum or a struct.
690 type2 = (union codeview_type *) ptr2.c;
691 if( type2->member.id == LF_MEMBER )
693 typeptr = DEBUG_NewDataType(DT_STRUCT, NULL);
694 fieldtype = DT_STRUCT;
696 else if( type2->member.id == LF_ENUMERATE )
698 typeptr = DEBUG_NewDataType(DT_ENUM, NULL);
706 cv_defined_types[curr_type - 0x1000] = typeptr;
707 while( ptr2.c < (ptr.c + ((type->generic.len + 3) & ~3)) )
709 type2 = (union codeview_type *) ptr2.c;
710 if( type2->member.id == LF_MEMBER && fieldtype == DT_STRUCT )
712 memset(symname, 0, sizeof(symname));
713 memcpy(symname, type2->member.name, type2->member.namelen);
715 subtype = DEBUG_GetCVType(type2->member.type);
717 if( subtype != NULL )
719 elem_size = DEBUG_GetObjectSize(subtype);
722 if( type2->member.offset >= 0x8000 )
725 * This is a numeric leaf, I am too lazy to handle this right
728 fprintf(stderr, "Ignoring large numberic leaf.\n");
732 DEBUG_AddStructElement(typeptr, symname, subtype,
733 type2->member.offset << 3,
737 else if( type2->member.id == LF_ENUMERATE && fieldtype == DT_ENUM )
739 memset(symname, 0, sizeof(symname));
740 memcpy(symname, type2->enumerate.name, type2->enumerate.namelen);
742 if( type2->enumerate.value >= 0x8000 )
745 * This is a numeric leaf, I am too lazy to handle this right
748 fprintf(stderr, "Ignoring large numberic leaf.\n");
752 DEBUG_AddStructElement(typeptr, symname, NULL,
753 type2->enumerate.value, 0);
759 * Something else I have never seen before. Either wrong type of
760 * object in the fieldlist, or some other problem which I wouldn't
761 * really know how to handle until it came up.
763 fprintf(stderr, "Unexpected entry in fieldlist\n");
768 ptr2.c += ((type2->member.namelen + 9 + 3) & ~3);
773 if( type->structure.structlen >= 0x8000 )
776 * This is a numeric leaf, I am too lazy to handle this right
779 fprintf(stderr, "Ignoring large numberic leaf.\n");
782 memset(symname, 0, sizeof(symname));
783 memcpy(symname, type->structure.name, type->structure.namelen);
784 if( strcmp(symname, "__unnamed") == 0 )
786 typeptr = DEBUG_NewDataType(DT_STRUCT, NULL);
790 typeptr = DEBUG_NewDataType(DT_STRUCT, symname);
792 cv_defined_types[curr_type - 0x1000] = typeptr;
795 * Now copy the relevant bits from the fieldlist that we specified.
797 subtype = DEBUG_GetCVType(type->structure.fieldlist);
799 if( subtype != NULL )
801 DEBUG_SetStructSize(typeptr, type->structure.structlen);
802 DEBUG_CopyFieldlist(typeptr, subtype);
806 if( type->t_union.un_len >= 0x8000 )
809 * This is a numeric leaf, I am too lazy to handle this right
812 fprintf(stderr, "Ignoring large numberic leaf.\n");
815 memset(symname, 0, sizeof(symname));
816 memcpy(symname, type->t_union.name, type->t_union.namelen);
818 if( strcmp(symname, "__unnamed") == 0 )
820 typeptr = DEBUG_NewDataType(DT_STRUCT, NULL);
824 typeptr = DEBUG_NewDataType(DT_STRUCT, symname);
827 cv_defined_types[curr_type - 0x1000] = typeptr;
830 * Now copy the relevant bits from the fieldlist that we specified.
832 subtype = DEBUG_GetCVType(type->t_union.field);
834 if( subtype != NULL )
836 DEBUG_SetStructSize(typeptr, type->t_union.un_len);
837 DEBUG_CopyFieldlist(typeptr, subtype);
841 typeptr = DEBUG_NewDataType(DT_BITFIELD, NULL);
842 cv_defined_types[curr_type - 0x1000] = typeptr;
843 DEBUG_SetBitfieldParams(typeptr, type->bitfield.bitoff,
844 type->bitfield.nbits,
845 DEBUG_GetCVType(type->bitfield.type));
848 memset(symname, 0, sizeof(symname));
849 memcpy(symname, type->enumeration.name, type->enumeration.namelen);
850 typeptr = DEBUG_NewDataType(DT_ENUM, symname);
851 cv_defined_types[curr_type - 0x1000] = typeptr;
854 * Now copy the relevant bits from the fieldlist that we specified.
856 subtype = DEBUG_GetCVType(type->enumeration.field);
858 if( subtype != NULL )
860 DEBUG_CopyFieldlist(typeptr, subtype);
868 ptr.c += (type->generic.len + 3) & ~3;
875 DEBUG_InitCVDataTypes()
878 * These are the common builtin types that are used by VC++.
880 cv_basic_types[T_NOTYPE] = NULL;
881 cv_basic_types[T_ABS] = NULL;
882 cv_basic_types[T_VOID] = DEBUG_NewDataType(DT_BASIC, "void");
883 cv_basic_types[T_CHAR] = DEBUG_NewDataType(DT_BASIC, "char");
884 cv_basic_types[T_SHORT] = DEBUG_NewDataType(DT_BASIC, "short int");
885 cv_basic_types[T_LONG] = DEBUG_NewDataType(DT_BASIC, "long int");
886 cv_basic_types[T_QUAD] = DEBUG_NewDataType(DT_BASIC, "long long int");
887 cv_basic_types[T_UCHAR] = DEBUG_NewDataType(DT_BASIC, "unsigned char");
888 cv_basic_types[T_USHORT] = DEBUG_NewDataType(DT_BASIC, "short unsigned int");
889 cv_basic_types[T_ULONG] = DEBUG_NewDataType(DT_BASIC, "long unsigned int");
890 cv_basic_types[T_UQUAD] = DEBUG_NewDataType(DT_BASIC, "long long unsigned int");
891 cv_basic_types[T_REAL32] = DEBUG_NewDataType(DT_BASIC, "float");
892 cv_basic_types[T_REAL64] = DEBUG_NewDataType(DT_BASIC, "double");
893 cv_basic_types[T_RCHAR] = DEBUG_NewDataType(DT_BASIC, "char");
894 cv_basic_types[T_WCHAR] = DEBUG_NewDataType(DT_BASIC, "short");
895 cv_basic_types[T_INT4] = DEBUG_NewDataType(DT_BASIC, "int");
896 cv_basic_types[T_UINT4] = DEBUG_NewDataType(DT_BASIC, "unsigned int");
898 cv_basic_types[T_32PVOID] = DEBUG_FindOrMakePointerType(cv_basic_types[T_VOID]);
899 cv_basic_types[T_32PCHAR] = DEBUG_FindOrMakePointerType(cv_basic_types[T_CHAR]);
900 cv_basic_types[T_32PSHORT] = DEBUG_FindOrMakePointerType(cv_basic_types[T_SHORT]);
901 cv_basic_types[T_32PLONG] = DEBUG_FindOrMakePointerType(cv_basic_types[T_LONG]);
902 cv_basic_types[T_32PQUAD] = DEBUG_FindOrMakePointerType(cv_basic_types[T_QUAD]);
903 cv_basic_types[T_32PUCHAR] = DEBUG_FindOrMakePointerType(cv_basic_types[T_UCHAR]);
904 cv_basic_types[T_32PUSHORT] = DEBUG_FindOrMakePointerType(cv_basic_types[T_USHORT]);
905 cv_basic_types[T_32PULONG] = DEBUG_FindOrMakePointerType(cv_basic_types[T_ULONG]);
906 cv_basic_types[T_32PUQUAD] = DEBUG_FindOrMakePointerType(cv_basic_types[T_UQUAD]);
907 cv_basic_types[T_32PREAL32] = DEBUG_FindOrMakePointerType(cv_basic_types[T_REAL32]);
908 cv_basic_types[T_32PREAL64] = DEBUG_FindOrMakePointerType(cv_basic_types[T_REAL64]);
909 cv_basic_types[T_32PRCHAR] = DEBUG_FindOrMakePointerType(cv_basic_types[T_RCHAR]);
910 cv_basic_types[T_32PWCHAR] = DEBUG_FindOrMakePointerType(cv_basic_types[T_WCHAR]);
911 cv_basic_types[T_32PINT4] = DEBUG_FindOrMakePointerType(cv_basic_types[T_INT4]);
912 cv_basic_types[T_32PUINT4] = DEBUG_FindOrMakePointerType(cv_basic_types[T_UINT4]);
916 * In this function, we keep track of deferred debugging information
917 * that we may need later if we were to need to use the internal debugger.
918 * We don't fully process it here for performance reasons.
921 DEBUG_RegisterDebugInfo( HMODULE hModule, const char *module_name)
923 int has_codeview = FALSE;
926 PIMAGE_DEBUG_DIRECTORY dbgptr;
928 PIMAGE_NT_HEADERS nth = PE_HEADER(hModule);
930 size = nth->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size;
932 v_addr = nth->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress;
933 dbgptr = (PIMAGE_DEBUG_DIRECTORY) (hModule + v_addr);
935 for(; size >= sizeof(*dbgptr); size -= sizeof(*dbgptr), dbgptr++ )
939 case IMAGE_DEBUG_TYPE_CODEVIEW:
940 case IMAGE_DEBUG_TYPE_MISC:
947 dbgptr = (PIMAGE_DEBUG_DIRECTORY) (hModule + v_addr);
948 for(; size >= sizeof(*dbgptr); size -= sizeof(*dbgptr), dbgptr++ )
952 case IMAGE_DEBUG_TYPE_COFF:
954 * If we have both codeview and COFF debug info, ignore the
955 * coff debug info as it would just confuse us, and it is
958 * FIXME - this is broken - if we cannot find the PDB file, then
959 * we end up with no debugging info at all. In this case, we
960 * should use the COFF info as a backup.
966 case IMAGE_DEBUG_TYPE_CODEVIEW:
967 case IMAGE_DEBUG_TYPE_MISC:
969 * This is usually an indirection to a .DBG file.
970 * This is similar to (but a slightly older format) from the
973 * First check to see if the image was 'stripped'. If so, it
974 * means that this entry points to a .DBG file. Otherwise,
975 * it just points to itself, and we can ignore this.
983 if( (dbgptr->Type != IMAGE_DEBUG_TYPE_MISC) ||
984 (PE_HEADER(hModule)->FileHeader.Characteristics & IMAGE_FILE_DEBUG_STRIPPED) != 0 )
988 DOS_FULL_NAME full_name;
989 struct deferred_debug_info* deefer = (struct deferred_debug_info *) DBG_alloc(sizeof(*deefer));
991 deefer->module = hModule;
992 deefer->load_addr = (char *)hModule;
995 * Read the important bits. What we do after this depends
996 * upon the type, but this is always enough so we are able
997 * to proceed if we know what we need to do next.
999 /* basically, the PE loader maps all sections (data, resources...), but doesn't map
1000 * the DataDirectory array's content. One its entry contains the *beloved*
1001 * debug information. (Note the DataDirectory is mapped, not its content)
1004 if (GetModuleFileNameA(hModule, fn, sizeof(fn)) > 0 &&
1005 DOSFS_GetFullName(fn, TRUE, &full_name) &&
1006 (fd = open(full_name.long_name, O_RDONLY)) > 0)
1008 deefer->dbg_info = mmap(NULL, dbgptr->SizeOfData,
1009 PROT_READ, MAP_PRIVATE, fd, dbgptr->PointerToRawData);
1011 if( deefer->dbg_info == (char *) 0xffffffff )
1020 fprintf(stderr, " (not mapped: fn=%s, lfn=%s, fd=%d)", fn, full_name.long_name, fd);
1023 deefer->dbg_size = dbgptr->SizeOfData;
1024 deefer->dbgdir = dbgptr;
1025 deefer->next = dbglist;
1026 deefer->loaded = FALSE;
1027 deefer->dbg_index = DEBUG_next_index;
1028 deefer->module_name = DBG_strdup(module_name);
1030 deefer->sectp = PE_SECTIONS(hModule);
1031 deefer->nsect = PE_HEADER(hModule)->FileHeader.NumberOfSections;
1043 /* look for .stabs/.stabstr sections */
1045 PIMAGE_SECTION_HEADER pe_seg = PE_SECTIONS(hModule);
1046 int i,stabsize=0,stabstrsize=0;
1047 unsigned int stabs=0,stabstr=0;
1049 for (i=0;i<nth->FileHeader.NumberOfSections;i++) {
1050 if (!strcasecmp(pe_seg[i].Name,".stab")) {
1051 stabs = pe_seg[i].VirtualAddress;
1052 stabsize = pe_seg[i].SizeOfRawData;
1054 if (!strncasecmp(pe_seg[i].Name,".stabstr",8)) {
1055 stabstr = pe_seg[i].VirtualAddress;
1056 stabstrsize = pe_seg[i].SizeOfRawData;
1059 if (stabstrsize && stabsize) {
1060 #ifdef _WE_SUPPORT_THE_STAB_TYPES_USED_BY_MINGW_TOO
1061 /* Won't work currently, since MINGW32 uses some special typedefs
1062 * which we do not handle yet. Support for them is a bit difficult.
1064 DEBUG_ParseStabs(hModule,0,stabs,stabsize,stabstr,stabstrsize);
1066 fprintf(stderr,"(stabs not loaded)");
1073 * ELF modules are also entered into the list - this is so that we
1074 * can make 'info shared' types of displays possible.
1077 DEBUG_RegisterELFDebugInfo(int load_addr, u_long size, char * name)
1079 struct deferred_debug_info * deefer;
1081 deefer = (struct deferred_debug_info *) DBG_alloc(sizeof(*deefer));
1085 * Read the important bits. What we do after this depends
1086 * upon the type, but this is always enough so we are able
1087 * to proceed if we know what we need to do next.
1089 deefer->dbg_size = size;
1090 deefer->dbg_info = (char *) NULL;
1092 deefer->load_addr = (char *) load_addr;
1093 deefer->dbgdir = NULL;
1094 deefer->next = dbglist;
1095 deefer->loaded = TRUE;
1096 deefer->dbg_index = DEBUG_next_index;
1097 deefer->module_name = DBG_strdup(name);
1108 * Process COFF debugging information embedded in a Win32 application.
1113 DEBUG_ProcessCoff(struct deferred_debug_info * deefer)
1115 struct CoffAuxSection * aux;
1116 struct CoffDebug * coff;
1117 struct CoffFiles * coff_files = NULL;
1118 struct CoffLinenum * coff_linetab;
1120 struct CoffSymbol * coff_sym;
1121 struct CoffSymbol * coff_symbol;
1122 struct CoffFiles * curr_file = NULL;
1126 struct CoffLinenum * linepnt;
1133 int nfiles_alloc = 0;
1134 struct CoffFiles orig_file;
1136 char * this_file = NULL;
1138 coff = (struct CoffDebug *) deefer->dbg_info;
1140 coff_symbol = (struct CoffSymbol *) ((unsigned int) coff + coff->SymbolOffset);
1141 coff_linetab = (struct CoffLinenum *) ((unsigned int) coff + coff->LinenumberOffset);
1142 coff_strtab = (char *) ((unsigned int) coff_symbol + 18*coff->N_Sym);
1146 for(i=0; i < coff->N_Sym; i++ )
1149 * We do this because some compilers (i.e. gcc) incorrectly
1150 * pad the structure up to a 4 byte boundary. The structure
1151 * is really only 18 bytes long, so we have to manually make sure
1154 * FIXME - there must be a way to have autoconf figure out the
1155 * correct compiler option for this. If it is always gcc, that
1156 * makes life simpler, but I don't want to force this.
1158 coff_sym = (struct CoffSymbol *) ((unsigned int) coff_symbol + 18*i);
1159 naux = coff_sym->NumberOfAuxSymbols;
1161 if( coff_sym->StorageClass == IMAGE_SYM_CLASS_FILE )
1163 if( nfiles + 1 >= nfiles_alloc )
1166 coff_files = (struct CoffFiles *) DBG_realloc(coff_files,
1167 nfiles_alloc * sizeof(struct CoffFiles));
1169 curr_file = coff_files + nfiles;
1171 curr_file->startaddr = 0xffffffff;
1172 curr_file->endaddr = 0;
1173 curr_file->filename = ((char *) coff_sym) + 18;
1174 curr_file->linetab_offset = -1;
1175 curr_file->linecnt = 0;
1176 curr_file->entries = NULL;
1177 curr_file->neps = curr_file->neps_alloc = 0;
1179 fprintf(stderr,"New file %s\n", curr_file->filename);
1186 * This guy marks the size and location of the text section
1187 * for the current file. We need to keep track of this so
1188 * we can figure out what file the different global functions
1191 if( (coff_sym->StorageClass == IMAGE_SYM_CLASS_STATIC)
1193 && (coff_sym->Type == 0)
1194 && (coff_sym->SectionNumber == 1) )
1196 aux = (struct CoffAuxSection *) ((unsigned int) coff_sym + 18);
1198 if( curr_file->linetab_offset != -1 )
1201 fprintf(stderr, "Duplicating sect from %s: %x %x %x %d %d\n",
1202 curr_file->filename,
1204 aux->NumberOfRelocations,
1205 aux->NumberOfLinenumbers,
1208 fprintf(stderr, "More sect %d %x %d %d %d\n",
1209 coff_sym->SectionNumber,
1212 coff_sym->StorageClass,
1213 coff_sym->NumberOfAuxSymbols);
1217 * Save this so we can copy bits from it.
1219 orig_file = *curr_file;
1222 * Duplicate the file entry. We have no way to describe
1223 * multiple text sections in our current way of handling things.
1225 if( nfiles + 1 >= nfiles_alloc )
1228 coff_files = (struct CoffFiles *) DBG_realloc(coff_files,
1229 nfiles_alloc * sizeof(struct CoffFiles));
1231 curr_file = coff_files + nfiles;
1233 curr_file->startaddr = 0xffffffff;
1234 curr_file->endaddr = 0;
1235 curr_file->filename = orig_file.filename;
1236 curr_file->linetab_offset = -1;
1237 curr_file->linecnt = 0;
1238 curr_file->entries = NULL;
1239 curr_file->neps = curr_file->neps_alloc = 0;
1244 fprintf(stderr, "New text sect from %s: %x %x %x %d %d\n",
1245 curr_file->filename,
1247 aux->NumberOfRelocations,
1248 aux->NumberOfLinenumbers,
1254 if( curr_file->startaddr > coff_sym->Value )
1256 curr_file->startaddr = coff_sym->Value;
1259 if( curr_file->startaddr > coff_sym->Value )
1261 curr_file->startaddr = coff_sym->Value;
1264 if( curr_file->endaddr < coff_sym->Value + aux->Length )
1266 curr_file->endaddr = coff_sym->Value + aux->Length;
1269 curr_file->linetab_offset = linetab_indx;
1270 curr_file->linecnt = aux->NumberOfLinenumbers;
1271 linetab_indx += aux->NumberOfLinenumbers;
1276 if( (coff_sym->StorageClass == IMAGE_SYM_CLASS_STATIC)
1278 && (coff_sym->SectionNumber == 1) )
1281 * This is a normal static function when naux == 0.
1282 * Just register it. The current file is the correct
1283 * one in this instance.
1285 if( coff_sym->N.Name.NotLong )
1287 memcpy(namebuff, coff_sym->N.ShortName, 8);
1289 nampnt = &namebuff[0];
1293 nampnt = coff_strtab + coff_sym->N.Name.StrTaboff;
1296 if( nampnt[0] == '_' )
1302 new_addr.off = (int) (deefer->load_addr + coff_sym->Value);
1304 if( curr_file->neps + 1 >= curr_file->neps_alloc )
1306 curr_file->neps_alloc += 10;
1307 curr_file->entries = (struct name_hash **)
1308 DBG_realloc(curr_file->entries,
1309 curr_file->neps_alloc * sizeof(struct name_hash *));
1312 fprintf(stderr,"\tAdding static symbol %s\n", nampnt);
1314 curr_file->entries[curr_file->neps++] =
1315 DEBUG_AddSymbol( nampnt, &new_addr, this_file, SYM_WIN32 );
1320 if( (coff_sym->StorageClass == IMAGE_SYM_CLASS_EXTERNAL)
1321 && ISFCN(coff_sym->Type)
1322 && (coff_sym->SectionNumber > 0) )
1324 if( coff_sym->N.Name.NotLong )
1326 memcpy(namebuff, coff_sym->N.ShortName, 8);
1328 nampnt = &namebuff[0];
1332 nampnt = coff_strtab + coff_sym->N.Name.StrTaboff;
1336 if( nampnt[0] == '_' )
1342 new_addr.off = (int) (deefer->load_addr + coff_sym->Value);
1345 fprintf(stderr, "%d: %x %s\n", i, new_addr.off, nampnt);
1347 fprintf(stderr,"\tAdding global symbol %s\n", nampnt);
1351 * Now we need to figure out which file this guy belongs to.
1354 for(j=0; j < nfiles; j++)
1356 if( coff_files[j].startaddr <= coff_sym->Value
1357 && coff_files[j].endaddr > coff_sym->Value )
1359 this_file = coff_files[j].filename;
1363 if( coff_files[j].neps + 1 >= coff_files[j].neps_alloc )
1365 coff_files[j].neps_alloc += 10;
1366 coff_files[j].entries = (struct name_hash **)
1367 DBG_realloc(coff_files[j].entries,
1368 coff_files[j].neps_alloc * sizeof(struct name_hash *));
1370 coff_files[j].entries[coff_files[j].neps++] =
1371 DEBUG_AddSymbol( nampnt, &new_addr, this_file, SYM_WIN32 );
1376 if( (coff_sym->StorageClass == IMAGE_SYM_CLASS_EXTERNAL)
1377 && (coff_sym->SectionNumber > 0) )
1380 * Similar to above, but for the case of data symbols.
1381 * These aren't treated as entrypoints.
1383 if( coff_sym->N.Name.NotLong )
1385 memcpy(namebuff, coff_sym->N.ShortName, 8);
1387 nampnt = &namebuff[0];
1391 nampnt = coff_strtab + coff_sym->N.Name.StrTaboff;
1395 if( nampnt[0] == '_' )
1401 new_addr.off = (int) (deefer->load_addr + coff_sym->Value);
1404 fprintf(stderr, "%d: %x %s\n", i, new_addr.off, nampnt);
1406 fprintf(stderr,"\tAdding global data symbol %s\n", nampnt);
1410 * Now we need to figure out which file this guy belongs to.
1412 DEBUG_AddSymbol( nampnt, &new_addr, NULL, SYM_WIN32 );
1417 if( (coff_sym->StorageClass == IMAGE_SYM_CLASS_STATIC)
1421 * Ignore these. They don't have anything to do with
1429 fprintf(stderr,"Skipping unknown entry %d %d %d\n", coff_sym->StorageClass,
1430 coff_sym->SectionNumber, naux);
1434 * For now, skip past the aux entries.
1441 * OK, we now should have a list of files, and we should have a list
1442 * of entrypoints. We need to sort the entrypoints so that we are
1443 * able to tie the line numbers with the given functions within the
1446 if( coff_files != NULL )
1448 for(j=0; j < nfiles; j++)
1450 if( coff_files[j].entries != NULL )
1452 qsort(coff_files[j].entries, coff_files[j].neps,
1453 sizeof(struct name_hash *), DEBUG_cmp_sym);
1458 * Now pick apart the line number tables, and attach the entries
1459 * to the given functions.
1461 for(j=0; j < nfiles; j++)
1464 if( coff_files[j].neps != 0 )
1465 for(k=0; k < coff_files[j].linecnt; k++)
1468 * Another monstrosity caused by the fact that we are using
1469 * a 6 byte structure, and gcc wants to pad structures to 4 byte
1470 * boundaries. Otherwise we could just index into an array.
1472 linepnt = (struct CoffLinenum *)
1473 ((unsigned int) coff_linetab +
1474 6*(coff_files[j].linetab_offset + k));
1476 * If we have spilled onto the next entrypoint, then
1477 * bump the counter..
1481 if (i+1 >= coff_files[j].neps) break;
1482 DEBUG_GetSymbolAddr(coff_files[j].entries[i+1], &new_addr);
1483 if( (((unsigned int)deefer->load_addr +
1484 linepnt->VirtualAddr) >= new_addr.off) )
1491 * Add the line number. This is always relative to the
1492 * start of the function, so we need to subtract that offset
1495 DEBUG_GetSymbolAddr(coff_files[j].entries[i], &new_addr);
1496 DEBUG_AddLineNumber(coff_files[j].entries[i],
1498 (unsigned int) deefer->load_addr
1499 + linepnt->VirtualAddr
1507 if( coff_files != NULL )
1509 for(j=0; j < nfiles; j++)
1511 if( coff_files[j].entries != NULL )
1513 DBG_free(coff_files[j].entries);
1516 DBG_free(coff_files);
1524 * Process a codeview line number table. Digestify the thing so that
1525 * we can easily reference the thing when we process the rest of
1528 static struct codeview_linetab_hdr *
1529 DEBUG_SnarfLinetab(char * linetab,
1533 char filename[PATH_MAX];
1534 unsigned int * filetab;
1538 struct codeview_linetab_hdr * lt_hdr;
1539 unsigned int * lt_ptr;
1543 union any_size pnt2;
1544 struct startend * start;
1548 * Now get the important bits.
1554 filetab = (unsigned int *) pnt.c;
1557 * Now count up the number of segments in the file.
1560 for(i=0; i<nfile; i++)
1562 pnt2.c = linetab + filetab[i];
1567 * Next allocate the header we will be returning.
1568 * There is one header for each segment, so that we can reach in
1569 * and pull bits as required.
1571 lt_hdr = (struct codeview_linetab_hdr *)
1572 DBG_alloc((nseg + 1) * sizeof(*lt_hdr));
1573 if( lt_hdr == NULL )
1578 memset(lt_hdr, 0, sizeof(*lt_hdr) * (nseg+1));
1581 * Now fill the header we will be returning, one for each segment.
1582 * Note that this will basically just contain pointers into the existing
1583 * line table, and we do not actually copy any additional information
1584 * or allocate any additional memory.
1588 for(i=0; i<nfile; i++)
1591 * Get the pointer into the segment information.
1593 pnt2.c = linetab + filetab[i];
1594 file_segcount = *pnt2.s;
1597 lt_ptr = (unsigned int *) pnt2.c;
1598 start = (struct startend *) (lt_ptr + file_segcount);
1601 * Now snarf the filename for all of the segments for this file.
1603 fn = (unsigned char *) (start + file_segcount);
1604 memset(filename, 0, sizeof(filename));
1605 memcpy(filename, fn + 1, *fn);
1606 fn = DBG_strdup(filename);
1608 for(k = 0; k < file_segcount; k++, this_seg++)
1610 pnt2.c = linetab + lt_ptr[k];
1611 lt_hdr[this_seg].start = start[k].start;
1612 lt_hdr[this_seg].end = start[k].end;
1613 lt_hdr[this_seg].sourcefile = fn;
1614 lt_hdr[this_seg].segno = *pnt2.s++;
1615 lt_hdr[this_seg].nline = *pnt2.s++;
1616 lt_hdr[this_seg].offtab = pnt2.ui;
1617 lt_hdr[this_seg].linetab = (unsigned short *)
1618 (pnt2.ui + lt_hdr[this_seg].nline);
1629 DEBUG_SnarfCodeView( struct deferred_debug_info * deefer,
1632 struct codeview_linetab_hdr * linetab)
1634 struct name_hash * curr_func = NULL;
1635 struct wine_locals * curr_sym = NULL;
1642 IMAGE_SECTION_HEADER * sectp;
1643 union codeview_symbol * sym;
1644 char symname[PATH_MAX];
1645 struct name_hash * thunk_sym = NULL;
1648 nsect = deefer->nsect;
1649 sectp = deefer->sectp;
1652 * Skip over the first word. Don't really know what it means, but
1658 * Loop over the different types of records and whenever we
1659 * find something we are interested in, record it and move on.
1661 while( ptr.c - cv_data < size )
1663 sym = (union codeview_symbol *) ptr.c;
1665 if( sym->generic.len - sizeof(int) == (ptr.c - cv_data) )
1668 * This happens when we have indirect symbols that VC++ 4.2
1669 * sometimes uses when there isn't a line number table.
1670 * We ignore it - we will process and enter all of the
1671 * symbols in the global symbol table anyways, so there
1672 * isn't much point in keeping track of all of this crap.
1677 memset(symname, 0, sizeof(symname));
1678 switch(sym->generic.id)
1684 * First, a couple of sanity checks.
1686 if( sym->data.namelen == 0 )
1691 if( sym->data.seg == 0 || sym->data.seg > nsect )
1697 * Global and local data symbols. We don't associate these
1698 * with any given source file.
1701 memcpy(symname, sym->data.name, sym->data.namelen);
1703 new_addr.type = DEBUG_GetCVType(sym->data.symtype);
1704 new_addr.off = (unsigned int) deefer->load_addr +
1705 sectp[sym->data.seg - 1].VirtualAddress +
1707 DEBUG_AddSymbol( symname, &new_addr, NULL, SYM_WIN32 | SYM_DATA );
1711 * Sort of like a global function, but it just points
1712 * to a thunk, which is a stupid name for what amounts to
1713 * a PLT slot in the normal jargon that everyone else uses.
1715 memcpy(symname, sym->thunk.name, sym->thunk.namelen);
1717 new_addr.type = NULL;
1718 new_addr.off = (unsigned int) deefer->load_addr +
1719 sectp[sym->thunk.segment - 1].VirtualAddress +
1721 thunk_sym = DEBUG_AddSymbol( symname, &new_addr, NULL,
1722 SYM_WIN32 | SYM_FUNC);
1723 DEBUG_SetSymbolSize(thunk_sym, sym->thunk.thunk_len);
1728 * Global and static functions.
1730 memcpy(symname, sym->proc.name, sym->proc.namelen);
1732 new_addr.type = DEBUG_GetCVType(sym->proc.proctype);
1733 new_addr.off = (unsigned int) deefer->load_addr +
1734 sectp[sym->proc.segment - 1].VirtualAddress +
1737 * See if we can find a segment that this goes with. If so,
1738 * it means that we also may have line number information
1739 * for this function.
1741 for(i=0; linetab[i].linetab != NULL; i++)
1743 if( ((unsigned int) deefer->load_addr
1744 + sectp[linetab[i].segno - 1].VirtualAddress
1745 + linetab[i].start <= new_addr.off)
1746 && ((unsigned int) deefer->load_addr
1747 + sectp[linetab[i].segno - 1].VirtualAddress
1748 + linetab[i].end > new_addr.off) )
1754 DEBUG_Normalize(curr_func);
1755 if( linetab[i].linetab == NULL )
1757 curr_func = DEBUG_AddSymbol( symname, &new_addr, NULL,
1758 SYM_WIN32 | SYM_FUNC);
1763 * First, create the entry. Then dig through the linetab
1764 * and add whatever line numbers are appropriate for this
1767 curr_func = DEBUG_AddSymbol( symname, &new_addr,
1768 linetab[i].sourcefile,
1769 SYM_WIN32 | SYM_FUNC);
1770 for(j=0; j < linetab[i].nline; j++)
1772 if( linetab[i].offtab[j] >= sym->proc.offset
1773 && linetab[i].offtab[j] < sym->proc.offset
1774 + sym->proc.proc_len )
1776 DEBUG_AddLineNumber(curr_func, linetab[i].linetab[j],
1777 linetab[i].offtab[j] - sym->proc.offset);
1784 * Add information about where we should set breakpoints
1787 DEBUG_SetSymbolBPOff(curr_func, sym->proc.debug_start);
1788 DEBUG_SetSymbolSize(curr_func, sym->proc.proc_len);
1792 * Function parameters and stack variables.
1794 memcpy(symname, sym->stack.name, sym->stack.namelen);
1795 curr_sym = DEBUG_AddLocal(curr_func,
1801 DEBUG_SetLocalSymbolType(curr_sym, DEBUG_GetCVType(sym->stack.symtype));
1809 * Adjust pointer to point to next entry, rounding up to a word
1810 * boundary. MS preserving alignment? Stranger things have
1813 if( sym->generic.id == S_PROCREF
1814 || sym->generic.id == S_DATAREF
1815 || sym->generic.id == S_UNKNOWN )
1817 len = (sym->generic.len + 3) & ~3;
1818 len += ptr.c[16] + 1;
1819 ptr.c += (len + 3) & ~3;
1823 ptr.c += (sym->generic.len + 3) & ~3;
1827 if( linetab != NULL )
1837 * Process PDB file which contains debug information.
1839 * These are really weird beasts. They are intended to be incrementally
1840 * updated by the incremental linker, and this means that you need to
1841 * be able to remove and add information. Thus the PDB file is sort of
1842 * like a block structured device, with a freelist and lists of extent numbers
1843 * that are used to get the relevant pieces. In all cases seen so far, the
1844 * blocksize is always 0x400 bytes. The header has a field which apparently
1845 * holds the blocksize, so if it ever changes we are safe.
1847 * In general, every time we need to extract something from the pdb file,
1848 * it is easier to copy it into another buffer so we have the information
1849 * in one contiguous block rather than attempt to try and keep track of when
1850 * we need to grab another extent from the pdb file.
1852 * The thing that is a real pain about some MS stuff is that they choose
1853 * data structures which are not representable in C. Thus we have to
1854 * hack around and diddle pointers.
1858 DEBUG_ProcessPDBFile(struct deferred_debug_info * deefer, char * full_filename)
1860 char * addr = (char *) 0xffffffff;
1861 unsigned int blocksize;
1862 unsigned int bufflen = 0;
1863 char * buffer = NULL;
1864 unsigned short * extent_table;
1866 struct file_ent * fent;
1867 char filename[MAX_PATHNAME_LEN];
1868 struct file_list * filelist = NULL;
1869 unsigned int gsym_record = 0;
1870 char * gsymtab = NULL;
1871 struct filetab_hdr * hd;
1874 unsigned int last_extent;
1875 struct codeview_linetab_hdr * linetab;
1876 unsigned int nblocks;
1878 unsigned int offset;
1879 struct codeview_pdb_hdr * pdbhdr;
1881 struct stat statbuf;
1883 unsigned short * table;
1885 unsigned int toc_blocks;
1887 LocateDebugInfoFile(full_filename, filename);
1888 status = stat(filename, &statbuf);
1891 fprintf(stderr, "-Unable to open .PDB file %s\n", filename);
1896 * Now open the file, so that we can mmap() it.
1898 fd = open(filename, O_RDONLY);
1901 fprintf(stderr, "-Unable to open .DBG file %s\n", filename);
1907 * Now mmap() the file.
1909 addr = mmap(0, statbuf.st_size, PROT_READ,
1910 MAP_PRIVATE, fd, 0);
1911 if( addr == (char *) 0xffffffff )
1913 fprintf(stderr, "-Unable to mmap .DBG file %s\n", filename);
1918 * Now that we have the formalities over and done with, we need
1919 * to find the table of contents for the PDB file.
1921 pdbhdr = (struct codeview_pdb_hdr *) addr;
1922 blocksize = pdbhdr->blocksize;
1923 last_extent = (statbuf.st_size + blocksize - 1) / blocksize;
1926 * The TOC itself isn't always contiguous, so we need to extract a few
1927 * extents from the file to form the TOC.
1929 toc_blocks = (pdbhdr->toc_len + blocksize - 1) / blocksize;
1930 toc = (char *) DBG_alloc(toc_blocks * blocksize);
1931 table = pdbhdr->toc_ext;
1932 for(i=0; i < toc_blocks; i++)
1934 memcpy(toc + blocksize*i, addr + table[i]*blocksize, blocksize);
1938 * Next build our own table which will have the size and extent block
1939 * list for each record in the PDB file.
1941 * The TOC starts out with the number of files. Then it is followed by
1942 * (npair * 2*sizeof(int)) bytes of information, which are pairs of ints.
1943 * The first one is the size of the record (in bytes), and the second one
1944 * is something else which I haven't figured out yet.
1946 pnt = (unsigned int *) toc;
1948 extent_table = (unsigned short *) ((unsigned int) toc +
1949 npair * 2 * sizeof(int) + sizeof(int));
1954 if( sizeof(int) + 2*sizeof(int)*npair > pdbhdr->toc_len )
1959 filelist = (struct file_list *) DBG_alloc(npair * sizeof(*filelist));
1960 if( filelist == NULL )
1964 memset(filelist, 0, npair * sizeof(*filelist));
1967 for(i=0; i < npair; i++)
1969 filelist[i].record_len = pnt[i*2];
1970 filelist[i].nextents = (filelist[i].record_len + blocksize - 1)
1972 filelist[i].extent_list = extent_table + nblocks;
1973 nblocks += filelist[i].nextents;
1976 * These get filled in later when we parse one of the records.
1978 filelist[i].linetab_offset = 0;
1979 filelist[i].linetab_len = 0;
1983 * OK, now walk through the various records and pick out the bits we
1984 * really want to see. Some of the records are extra special, and
1985 * we need to handle these a little bit differently.
1987 for(i=0; i < npair; i++)
1989 if( filelist[i].record_len == 0xffffffff )
1995 * Make sure our buffer is large enough to hold the record.
1997 if( bufflen < filelist[i].nextents * blocksize )
1999 bufflen = filelist[i].nextents * blocksize;
2000 buffer = (char *) DBG_realloc(buffer, bufflen);
2004 * Do this just for completeness. It makes debugging easier
2005 * if we have a clean indication of where the record ends.
2007 memset(buffer, 0, filelist[i].nextents * blocksize);
2010 * Next, build the record using the extent list.
2012 for(j=0; j < filelist[i].nextents; j++)
2014 memcpy(buffer + j * blocksize,
2015 addr + filelist[i].extent_list[j] * blocksize,
2019 pnt = (unsigned int *) buffer;
2022 * OK, now figure out what to do with it.
2026 * Always ignore the first entry. It seems to contain a backup copy
2027 * of the TOC (the last time the file was modified??)
2035 * The second entry as a id block. It contains a magic number
2036 * to identify the compiler, plus it also contains the timestamp
2037 * which must match the timestamp in the executable.
2042 if( ((*pnt != 19950623) && (*pnt != 19950814))
2043 || (filelist[i].record_len != 0x24)
2044 || (pnt[1] != ((struct CodeViewDebug *)(deefer->dbg_info))->cv_timestamp) )
2051 * The third entry contains pointers to the global symbol table,
2052 * plus it also contains additional information about each record
2057 hd = (struct filetab_hdr *) buffer;
2059 gsym_record = hd->gsym_file;
2060 gsymtab = (char *) DBG_alloc(filelist[gsym_record].nextents
2062 memset(gsymtab, 0, filelist[gsym_record].nextents * blocksize);
2064 for(j=0; j < filelist[gsym_record].nextents; j++)
2066 memcpy(gsymtab + j * blocksize,
2067 addr + filelist[gsym_record].extent_list[j] * blocksize,
2072 * This record also contains information about where in the
2073 * remaining records we will be able to find the start of the
2074 * line number table. We could locate that bit using heuristics,
2075 * but since we have the info handy, we might as well use it.
2077 offset = sizeof(*hd);
2080 fent = (struct file_ent *) (buffer + offset);
2081 if( offset > hd->ftab_len )
2086 if( fent->file_number == 0 || fent->file_number >= npair )
2091 filelist[fent->file_number].linetab_offset =
2092 fent->linetab_offset;
2093 filelist[fent->file_number].linetab_len =
2096 * Figure out the offset of the next entry.
2097 * There is a fixed part of the record and a variable
2098 * length filename which we must also skip past.
2100 offset += ((unsigned int) &fent->filename - (unsigned int) fent)
2101 + strlen(fent->filename) + 1;
2102 offset += strlen(buffer+offset) + 1;
2103 offset = (offset + 3) & ~3;
2109 * Two different magic numbers used as dates.
2110 * These indicate the 'type' table.
2112 if( *pnt == 19950410
2113 || *pnt == 19951122 )
2115 DEBUG_ParseTypeTable(buffer, filelist[i].record_len);
2120 * This is something we really want to look at, since it contains
2121 * real debug info. Anything that doesn't match this can be
2127 * First, snag the line table, if we have one. This always
2128 * occurs at the end of the record, so we take the linetab
2129 * offset as the end of the normal part of the record.
2132 if( filelist[i].linetab_len != 0 )
2134 linetab = DEBUG_SnarfLinetab(buffer + filelist[i].linetab_offset,
2135 filelist[i].linetab_len);
2136 DEBUG_SnarfCodeView(deefer, buffer,
2137 filelist[i].linetab_offset,
2142 DEBUG_SnarfCodeView(deefer, buffer,
2143 filelist[i].record_len,
2151 * Finally, process the global symbol table itself. There isn't
2152 * a line number component to this, so we just toss everything
2153 * into the mix and it all should work out.
2155 if( gsym_record != 0 )
2157 DEBUG_SnarfCodeView(deefer, gsymtab - sizeof(int),
2158 filelist[gsym_record].record_len,
2164 if( gsymtab != NULL )
2170 if( buffer != NULL )
2175 if( filelist != NULL )
2180 if( addr != (char *) 0xffffffff )
2182 munmap(addr, statbuf.st_size);
2194 * Process DBG file which contains debug information.
2198 DEBUG_ProcessDBGFile(struct deferred_debug_info * deefer, char * filename)
2200 char * addr = (char *) 0xffffffff;
2202 struct CV4_DirHead * codeview_dir;
2203 struct CV4_DirEnt * codeview_dent;
2204 PIMAGE_DEBUG_DIRECTORY dbghdr;
2205 struct deferred_debug_info deefer2;
2209 struct codeview_linetab_hdr * linetab;
2211 PIMAGE_SEPARATE_DEBUG_HEADER pdbg = NULL;
2212 IMAGE_SECTION_HEADER * sectp;
2213 struct stat statbuf;
2215 char dbg_file[MAX_PATHNAME_LEN];
2217 LocateDebugInfoFile(filename, dbg_file);
2218 status = stat(dbg_file, &statbuf);
2221 fprintf(stderr, "-Unable to open .DBG file %s\n", dbg_file);
2226 * Now open the file, so that we can mmap() it.
2228 fd = open(dbg_file, O_RDONLY);
2231 fprintf(stderr, "Unable to open .DBG file %s\n", dbg_file);
2237 * Now mmap() the file.
2239 addr = mmap(0, statbuf.st_size, PROT_READ,
2240 MAP_PRIVATE, fd, 0);
2241 if( addr == (char *) 0xffffffff )
2243 fprintf(stderr, "Unable to mmap .DBG file %s\n", dbg_file);
2247 pdbg = (PIMAGE_SEPARATE_DEBUG_HEADER) addr;
2249 if( pdbg->TimeDateStamp != deefer->dbgdir->TimeDateStamp )
2251 fprintf(stderr, "Warning - %s has incorrect internal timestamp\n",
2255 Well, sometimes this happens to DBG files which ARE REALLY the right .DBG
2256 files but nonetheless this check fails. Anyway, WINDBG (debugger for
2257 Windows by Microsoft) loads debug symbols which have incorrect timestamps.
2261 fprintf(stderr, "Processing symbols from %s...\n", dbg_file);
2263 dbghdr = (PIMAGE_DEBUG_DIRECTORY) ( addr + sizeof(*pdbg)
2264 + pdbg->NumberOfSections * sizeof(IMAGE_SECTION_HEADER)
2265 + pdbg->ExportedNamesSize);
2267 sectp = (PIMAGE_SECTION_HEADER) ((char *) pdbg + sizeof(*pdbg));
2268 nsect = pdbg->NumberOfSections;
2270 for( i=0; i < pdbg->DebugDirectorySize / sizeof(*pdbg); i++, dbghdr++ )
2272 switch(dbghdr->Type)
2274 case IMAGE_DEBUG_TYPE_COFF:
2276 * Dummy up a deferred debug header to handle the
2277 * COFF stuff embedded within the DBG file.
2279 memset((char *) &deefer2, 0, sizeof(deefer2));
2280 deefer2.dbg_info = (addr + dbghdr->PointerToRawData);
2281 deefer2.dbg_size = dbghdr->SizeOfData;
2282 deefer2.load_addr = deefer->load_addr;
2284 DEBUG_ProcessCoff(&deefer2);
2286 case IMAGE_DEBUG_TYPE_CODEVIEW:
2288 * This is the older format by which codeview stuff is
2289 * stored, known as the 'NB09' format. Newer executables
2290 * and dlls created by VC++ use PDB files instead, which
2291 * have lots of internal similarities, but the overall
2292 * format and structure is quite different.
2294 codeview = (addr + dbghdr->PointerToRawData);
2297 * The first thing in the codeview section should be
2298 * an 'NB09' identifier. As a sanity check, make sure
2301 if( *((unsigned int*) codeview) != 0x3930424e )
2307 * Next we need to find the directory. This is easy too.
2309 codeview_dir = (struct CV4_DirHead *)
2310 (codeview + ((unsigned int*) codeview)[1]);
2313 * Some more sanity checks. Make sure that everything
2314 * is as we expect it.
2316 if( codeview_dir->next_offset != 0
2317 || codeview_dir->dhsize != sizeof(*codeview_dir)
2318 || codeview_dir->desize != sizeof(*codeview_dent) )
2322 codeview_dent = (struct CV4_DirEnt *) (codeview_dir + 1);
2324 for(j=0; j < codeview_dir->ndir; j++, codeview_dent++)
2326 if( codeview_dent->subsect_number == sstAlignSym )
2329 * Check the previous entry. If it is a
2330 * sstSrcModule, it contains the line number
2331 * info for this file.
2334 if( codeview_dent[1].module_number == codeview_dent[0].module_number
2335 && codeview_dent[1].subsect_number == sstSrcModule )
2337 linetab = DEBUG_SnarfLinetab(
2338 codeview + codeview_dent[1].offset,
2339 codeview_dent[1].size);
2342 if( codeview_dent[-1].module_number == codeview_dent[0].module_number
2343 && codeview_dent[-1].subsect_number == sstSrcModule )
2345 linetab = DEBUG_SnarfLinetab(
2346 codeview + codeview_dent[-1].offset,
2347 codeview_dent[-1].size);
2350 * Now process the CV stuff.
2352 DEBUG_SnarfCodeView(deefer,
2353 codeview + codeview_dent->offset,
2354 codeview_dent->size,
2366 if( addr != (char *) 0xffffffff )
2368 munmap(addr, statbuf.st_size);
2380 DEBUG_ProcessDeferredDebug()
2382 struct deferred_debug_info * deefer;
2383 struct CodeViewDebug * cvd;
2384 struct MiscDebug * misc;
2389 DEBUG_InitCVDataTypes();
2391 for(deefer = dbglist; deefer; deefer = deefer->next)
2393 if( deefer->loaded )
2398 if( last_proc != deefer->dbg_index )
2402 fprintf(stderr, "DeferredDebug for:");
2405 fprintf(stderr, " %s",deefer->module_name);
2406 last_proc = deefer->dbg_index;
2409 switch(deefer->dbgdir->Type)
2411 case IMAGE_DEBUG_TYPE_COFF:
2413 * Standard COFF debug information that VC++ adds when you
2414 * use /debugtype:both with the linker.
2417 fprintf(stderr, "Processing COFF symbols...\n");
2419 DEBUG_ProcessCoff(deefer);
2421 case IMAGE_DEBUG_TYPE_CODEVIEW:
2423 * This is a pointer to a PDB file of some sort.
2425 cvd = (struct CodeViewDebug *) deefer->dbg_info;
2427 if( strcmp(cvd->cv_nbtype, "NB10") != 0 )
2430 * Whatever this is, we don't know how to deal with
2435 DEBUG_ProcessPDBFile(deefer, cvd->cv_name);
2437 fprintf(stderr, "Processing PDB file %s\n", cvd->cv_name);
2440 case IMAGE_DEBUG_TYPE_MISC:
2442 * A pointer to a .DBG file of some sort. These files
2443 * can contain either CV4 or COFF information. Open
2444 * the file, and try to do the right thing with it.
2446 misc = (struct MiscDebug *) deefer->dbg_info;
2448 filename = strrchr((char *) &misc->Data, '.');
2451 * Ignore the file if it doesn't have a .DBG extension.
2453 if( (filename == NULL)
2454 || ( (strcmp(filename, ".dbg") != 0)
2455 && (strcmp(filename, ".DBG") != 0)) )
2460 filename = (char *) &misc->Data;
2463 * Do the dirty deed...
2465 DEBUG_ProcessDBGFile(deefer, filename);
2470 * We should never get here...
2476 fprintf(stderr, "\n");
2481 /***********************************************************************
2484 * Display shared libarary information.
2486 void DEBUG_InfoShare(void)
2488 struct deferred_debug_info * deefer;
2490 fprintf(stderr,"Address\t\tModule\tName\n");
2492 for(deefer = dbglist; deefer; deefer = deefer->next)
2494 fprintf(stderr,"0x%8.8x\t(%s)\t%s\n", (unsigned int) deefer->load_addr,
2495 deefer->module ? "Win32" : "ELF", deefer->module_name);