debug.h must be last, or we get ERR() macro problems again.
[wine/multimedia.git] / debugger / msc.c
blob7565dc039cb17b99dc97adae53fc4b185e5f4541
1 /*
2 * File msc.c - read VC++ debug information from COFF and eventually
3 * from PDB files.
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.
12 * TODO:
13 * Get 16 bit CV stuff working.
14 * Add symbol size to internal symbol table.
17 #include "config.h"
18 #include <stdio.h>
19 #include <stdlib.h>
21 #include <sys/types.h>
22 #include <sys/mman.h>
23 #include <fcntl.h>
24 #include <sys/stat.h>
25 #include <limits.h>
26 #include <string.h>
27 #include <unistd.h>
28 #ifndef PATH_MAX
29 #define PATH_MAX _MAX_PATH
30 #endif
31 #include "debugger.h"
32 #include "neexe.h"
33 #include "peexe.h"
34 #include "xmalloc.h"
35 #include "file.h"
38 *dbg_filename must be at least MAX_PATHNAME_LEN bytes in size
40 static void LocateDebugInfoFile(char *filename, char *dbg_filename)
42 char *str1 = xmalloc(MAX_PATHNAME_LEN*10);
43 char *str2 = xmalloc(MAX_PATHNAME_LEN);
44 char *file;
45 char *name_part;
46 DOS_FULL_NAME fullname;
48 file = strrchr(filename, '\\');
49 if( file == NULL ) file = filename; else file++;
51 if (GetEnvironmentVariableA("_NT_SYMBOL_PATH", str1, MAX_PATHNAME_LEN))
52 if (SearchPathA(str1, file, NULL, MAX_PATHNAME_LEN*10, str2, &name_part))
53 goto ok;
54 if (GetEnvironmentVariableA("_NT_ALT_SYMBOL_PATH", str1, MAX_PATHNAME_LEN))
55 if (SearchPathA(str1, file, NULL, MAX_PATHNAME_LEN*10, str2, &name_part))
56 goto ok;
57 if (SearchPathA(NULL, file, NULL, MAX_PATHNAME_LEN*10, str2, &name_part))
58 goto ok;
59 else
61 quit:
62 memcpy(dbg_filename, filename, MAX_PATHNAME_LEN);
63 free(str1);
64 free(str2);
65 return;
67 ok:
68 if (DOSFS_GetFullName(str2, TRUE, &fullname))
69 memcpy(dbg_filename, fullname.long_name, MAX_PATHNAME_LEN);
70 else
71 goto quit;
72 free(str1);
73 free(str2);
74 return;
77 * This is an index we use to keep track of the debug information
78 * when we have multiple sources. We use the same database to also
79 * allow us to do an 'info shared' type of deal, and we use the index
80 * to eliminate duplicates.
82 static int DEBUG_next_index = 0;
84 union any_size
86 char * c;
87 short * s;
88 int * i;
89 unsigned int * ui;
93 * This is a convenience structure used to map portions of the
94 * line number table.
96 struct startend
98 unsigned int start;
99 unsigned int end;
103 * This is how we reference the various record types.
105 union codeview_symbol
107 struct
109 short int len;
110 short int id;
111 } generic;
113 struct
115 short int len;
116 short int id;
117 unsigned int offset;
118 unsigned short seg;
119 unsigned short symtype;
120 unsigned char namelen;
121 unsigned char name[1];
122 } data;
124 struct
126 short int len;
127 short int id;
128 unsigned int pparent;
129 unsigned int pend;
130 unsigned int next;
131 unsigned int offset;
132 unsigned short segment;
133 unsigned short thunk_len;
134 unsigned char thtype;
135 unsigned char namelen;
136 unsigned char name[1];
137 } thunk;
138 struct
140 short int len;
141 short int id;
142 unsigned int pparent;
143 unsigned int pend;
144 unsigned int next;
145 unsigned int proc_len;
146 unsigned int debug_start;
147 unsigned int debug_end;
148 unsigned int offset;
149 unsigned short segment;
150 unsigned short proctype;
151 unsigned char flags;
152 unsigned char namelen;
153 unsigned char name[1];
154 } proc;
155 struct
157 short int len; /* Total length of this entry */
158 short int id; /* Always S_BPREL32 */
159 unsigned int offset; /* Stack offset relative to BP */
160 unsigned short symtype;
161 unsigned char namelen;
162 unsigned char name[1];
163 } stack;
166 union codeview_type
168 struct
170 short int len;
171 short int id;
172 } generic;
174 struct
176 short int len;
177 short int id;
178 short int attribute;
179 short int datatype;
180 unsigned char variant[1];
181 } pointer;
183 struct
185 short int len;
186 short int id;
187 unsigned char nbits;
188 unsigned char bitoff;
189 unsigned short type;
190 } bitfield;
192 struct
194 short int len;
195 short int id;
196 short int elemtype;
197 short int idxtype;
198 unsigned char arrlen;
199 unsigned char namelen;
200 unsigned char name[1];
201 } array;
203 struct
205 short int len;
206 short int id;
207 short int n_element;
208 short int fieldlist;
209 short int property;
210 short int derived;
211 short int vshape;
212 unsigned short structlen;
213 unsigned char namelen;
214 unsigned char name[1];
215 } structure;
217 struct
219 short int len;
220 short int id;
221 short int count;
222 short int field;
223 short int property;
224 unsigned short un_len;
225 unsigned char namelen;
226 unsigned char name[1];
227 } t_union;
229 struct
231 short int len;
232 short int id;
233 short int count;
234 short int type;
235 short int field;
236 short int property;
237 unsigned char namelen;
238 unsigned char name[1];
239 } enumeration;
241 struct
243 short int id;
244 short int attribute;
245 unsigned short int value;
246 unsigned char namelen;
247 unsigned char name[1];
248 } enumerate;
250 struct
252 short int id;
253 short int type;
254 short int attribute;
255 unsigned short int offset;
256 unsigned char namelen;
257 unsigned char name[1];
258 } member;
260 struct
262 short int len;
263 short int id;
264 short int count;
265 short int type;
266 short int field;
267 short int property;
268 unsigned char namelen;
269 unsigned char name[1];
270 } fieldlist;
274 #define S_BPREL 0x200
275 #define S_LDATA 0x201
276 #define S_GDATA 0x202
277 #define S_PUB 0x203
278 #define S_LPROC 0x204
279 #define S_GPROC 0x205
280 #define S_THUNK 0x206
281 #define S_BLOCK 0x207
282 #define S_WITH 0x208
283 #define S_LABEL 0x209
285 #define S_PROCREF 0x400
286 #define S_DATAREF 0x401
287 #define S_ALIGN 0x402
288 #define S_UNKNOWN 0x403
291 * This covers the basic datatypes that VC++ seems to be using these days.
292 * 32 bit mode only. There are additional numbers for the pointers in 16
293 * bit mode. There are many other types listed in the documents, but these
294 * are apparently not used by the compiler, or represent pointer types
295 * that are not used.
297 #define T_NOTYPE 0x0000 /* Notype */
298 #define T_ABS 0x0001 /* Abs */
299 #define T_VOID 0x0003 /* Void */
300 #define T_CHAR 0x0010 /* signed char */
301 #define T_SHORT 0x0011 /* short */
302 #define T_LONG 0x0012 /* long */
303 #define T_QUAD 0x0013 /* long long */
304 #define T_UCHAR 0x0020 /* unsigned char */
305 #define T_USHORT 0x0021 /* unsigned short */
306 #define T_ULONG 0x0022 /* unsigned long */
307 #define T_UQUAD 0x0023 /* unsigned long long */
308 #define T_REAL32 0x0040 /* float */
309 #define T_REAL64 0x0041 /* double */
310 #define T_RCHAR 0x0070 /* real char */
311 #define T_WCHAR 0x0071 /* wide char */
312 #define T_INT4 0x0074 /* int */
313 #define T_UINT4 0x0075 /* unsigned int */
315 #define T_32PVOID 0x0403 /* 32 bit near pointer to void */
316 #define T_32PCHAR 0x0410 /* 16:32 near pointer to signed char */
317 #define T_32PSHORT 0x0411 /* 16:32 near pointer to short */
318 #define T_32PLONG 0x0412 /* 16:32 near pointer to int */
319 #define T_32PQUAD 0x0413 /* 16:32 near pointer to long long */
320 #define T_32PUCHAR 0x0420 /* 16:32 near pointer to unsigned char */
321 #define T_32PUSHORT 0x0421 /* 16:32 near pointer to unsigned short */
322 #define T_32PULONG 0x0422 /* 16:32 near pointer to unsigned int */
323 #define T_32PUQUAD 0x0423 /* 16:32 near pointer to long long */
324 #define T_32PREAL32 0x0440 /* 16:32 near pointer to float */
325 #define T_32PREAL64 0x0441 /* 16:32 near pointer to float */
326 #define T_32PRCHAR 0x0470 /* 16:32 near pointer to real char */
327 #define T_32PWCHAR 0x0471 /* 16:32 near pointer to real char */
328 #define T_32PINT4 0x0474 /* 16:32 near pointer to int */
329 #define T_32PUINT4 0x0475 /* 16:32 near pointer to unsigned int */
331 #define LF_MODIFIER 0x1
332 #define LF_POINTER 0x2
333 #define LF_ARRAY 0x3
334 #define LF_CLASS 0x4
335 #define LF_STRUCTURE 0x5
336 #define LF_UNION 0x6
337 #define LF_ENUMERATION 0x7
338 #define LF_PROCEDURE 0x8
339 #define LF_MFUNCTION 0x9
340 #define LF_VTSHAPE 0xa
341 #define LF_BARRAY 0xd
342 #define LF_DIMARRAY 0x11
343 #define LF_VFTPATH 0x12
345 #define LF_SKIP 0x200
346 #define LF_ARGLIST 0x201
347 #define LF_FIELDLIST 0x204
348 #define LF_DERIVED 0x205
349 #define LF_BITFIELD 0x206
351 #define LF_BCLASS 0x400
352 #define LF_VBCLASS 0x401
353 #define LF_IVBCLASS 0x402
354 #define LF_ENUMERATE 0x403
355 #define LF_FRIENDFCN 0x404
356 #define LF_INDEX 0x405
357 #define LF_MEMBER 0x406
358 #define LF_STMEMBER 0x407
359 #define LF_METHOD 0x408
360 #define LF_NESTEDTYPE 0x409
361 #define LF_VFUNCTAB 0x40a
362 #define LF_FRIENDCLS 0x40b
363 #define LF_ONEMETHOD 0x40c
364 #define LF_FUNCOFF 0x40d
366 #define MAX_BUILTIN_TYPES 0x480
367 static struct datatype * cv_basic_types[MAX_BUILTIN_TYPES];
368 static int num_cv_defined_types = 0;
369 static struct datatype **cv_defined_types = NULL;
372 * For the type CODEVIEW debug directory entries, the debug directory
373 * points to a structure like this. The cv_name field is the name
374 * of an external .PDB file.
376 struct CodeViewDebug
378 char cv_nbtype[8];
379 unsigned int cv_timestamp;
380 char cv_unknown[4];
381 char cv_name[1];
384 struct MiscDebug {
385 unsigned int DataType;
386 unsigned int Length;
387 char Unicode;
388 char Reserved[3];
389 char Data[1];
393 * This is the header that the COFF variety of debug header points to.
395 struct CoffDebug {
396 unsigned int N_Sym;
397 unsigned int SymbolOffset;
398 unsigned int N_Linenum;
399 unsigned int LinenumberOffset;
400 unsigned int Unused[4];
403 struct CoffLinenum {
404 unsigned int VirtualAddr;
405 unsigned short int Linenum;
408 struct CoffFiles {
409 unsigned int startaddr;
410 unsigned int endaddr;
411 char * filename;
412 int linetab_offset;
413 int linecnt;
414 struct name_hash **entries;
415 int neps;
416 int neps_alloc;
420 struct CoffSymbol {
421 union {
422 char ShortName[8];
423 struct {
424 unsigned int NotLong;
425 unsigned int StrTaboff;
426 } Name;
427 } N;
428 unsigned int Value;
429 short SectionNumber;
430 short Type;
431 char StorageClass;
432 unsigned char NumberOfAuxSymbols;
435 struct CoffAuxSection{
436 unsigned int Length;
437 unsigned short NumberOfRelocations;
438 unsigned short NumberOfLinenumbers;
439 unsigned int CheckSum;
440 short Number;
441 char Selection;
442 } Section;
445 * These two structures are used in the directory within a .DBG file
446 * to locate the individual important bits that we might want to see.
448 struct CV4_DirHead {
449 short unsigned int dhsize;
450 short unsigned int desize;
451 unsigned int ndir;
452 unsigned int next_offset;
453 unsigned int flags;
456 struct CV4_DirEnt {
457 short unsigned int subsect_number;
458 short unsigned int module_number;
459 unsigned int offset;
460 unsigned int size;
464 * These are the values of interest that the subsect_number field takes.
466 #define sstAlignSym 0x125
467 #define sstSrcModule 0x127
469 struct codeview_linetab_hdr
471 unsigned int nline;
472 unsigned int segno;
473 unsigned int start;
474 unsigned int end;
475 char * sourcefile;
476 unsigned short * linetab;
477 unsigned int * offtab;
480 struct codeview_pdb_hdr
482 char ident[44];
483 unsigned int blocksize; /* Extent size */
484 unsigned short loc_freelist; /* freelist. */
485 unsigned short alloc_filesize; /* # extents allocated. */
486 unsigned int toc_len;
487 unsigned int unknown;
488 unsigned short toc_ext[1]; /* array of extent #'s for toc. */
492 * This is our own structure that we use to keep track of the contents
493 * of a PDB file.
495 struct file_list
497 int record_len;
498 int nextents;
499 short int * extent_list;
500 unsigned int linetab_offset;
501 unsigned int linetab_len;
505 * These are the structures that represent how the file table is set up
506 * within the PDB file.
508 struct filetab_hdr
510 unsigned short tab1_file;
511 unsigned short tab2_file;
512 unsigned short gsym_file;
513 unsigned short padding;
514 unsigned int ftab_len;
515 unsigned int fofftab_len;
516 unsigned int hash_len;
517 unsigned int strtab_len;
520 struct file_ent
522 unsigned int reserved1;
523 unsigned short datasect_segment;
524 unsigned short reserved2;
525 unsigned int datasect_offset;
526 unsigned int datasect_size;
527 unsigned int datasect_flags;
528 unsigned short reserved3;
529 unsigned short index;
530 unsigned short num6a;
531 unsigned short file_number;
532 unsigned int linetab_offset;
533 unsigned int linetab_len;
534 unsigned int num9;
535 unsigned int num10;
536 unsigned int num11;
537 unsigned char filename[1];
541 ********************************************************************
543 struct deferred_debug_info
545 struct deferred_debug_info * next;
546 char * load_addr;
547 char * module_name;
548 char * dbg_info;
549 int dbg_size;
550 HMODULE module;
551 PIMAGE_DEBUG_DIRECTORY dbgdir;
552 PIMAGE_SECTION_HEADER sectp;
553 int nsect;
554 short int dbg_index;
555 char loaded;
558 struct deferred_debug_info * dbglist = NULL;
561 * A simple macro that tells us whether a given COFF symbol is a
562 * function or not.
564 #define N_TMASK 0x0030
565 #define IMAGE_SYM_DTYPE_FUNCTION 2
566 #define N_BTSHFT 4
567 #define ISFCN(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_FUNCTION << N_BTSHFT))
571 * This is what we are looking for in the COFF symbols.
573 #define IMAGE_SYM_CLASS_EXTERNAL 0x2
574 #define IMAGE_SYM_CLASS_STATIC 0x3
575 #define IMAGE_SYM_CLASS_FILE 0x67
577 static
578 struct datatype * DEBUG_GetCVType(int typeno)
580 struct datatype * dt = NULL;
583 * Convert Codeview type numbers into something we can grok internally.
584 * Numbers < 0x1000 are all fixed builtin types. Numbers from 0x1000 and
585 * up are all user defined (structs, etc).
587 if( typeno < 0x1000 )
589 if( typeno < MAX_BUILTIN_TYPES )
591 dt = cv_basic_types[typeno];
594 else
596 if( typeno - 0x1000 < num_cv_defined_types )
598 dt = cv_defined_types[typeno - 0x1000];
602 return dt;
605 static int
606 DEBUG_ParseTypeTable(char * table, int len)
608 int arr_max;
609 int curr_type;
610 enum debug_type fieldtype;
611 int elem_size;
612 union any_size ptr;
613 union any_size ptr2;
614 struct datatype * subtype;
615 char symname[256];
616 union codeview_type * type;
617 union codeview_type * type2;
618 struct datatype * typeptr;
620 curr_type = 0x1000;
622 ptr = (union any_size) (table + 16);
623 while( ptr.c - table < len )
625 type = (union codeview_type *) ptr.c;
627 if( curr_type - 0x1000 >= num_cv_defined_types )
629 num_cv_defined_types += 0x100;
630 cv_defined_types = (struct datatype **) realloc(cv_defined_types,
631 num_cv_defined_types * sizeof(struct datatype *));
632 memset(cv_defined_types + num_cv_defined_types - 0x100,
634 0x100 * sizeof(struct datatype *));
635 if( cv_defined_types == NULL )
637 return FALSE;
641 switch(type->generic.id)
643 case LF_POINTER:
644 cv_defined_types[curr_type - 0x1000] =
645 DEBUG_FindOrMakePointerType(DEBUG_GetCVType(type->pointer.datatype));
646 break;
647 case LF_ARRAY:
648 if( type->array.arrlen >= 0x8000 )
651 * This is a numeric leaf, I am too lazy to handle this right
652 * now.
654 fprintf(stderr, "Ignoring large numberic leaf.\n");
655 break;
657 if( type->array.namelen != 0 )
659 memset(symname, 0, sizeof(symname));
660 memcpy(symname, type->array.name, type->array.namelen);
661 typeptr = DEBUG_NewDataType(DT_ARRAY, symname);
663 else
665 typeptr = DEBUG_NewDataType(DT_ARRAY, NULL);
667 cv_defined_types[curr_type - 0x1000] = typeptr;
669 subtype = DEBUG_GetCVType(type->array.elemtype);
670 if( (subtype == NULL)
671 || (elem_size = DEBUG_GetObjectSize(subtype)) == 0 )
673 arr_max = 0;
675 else
677 arr_max = type->array.arrlen / DEBUG_GetObjectSize(subtype);
680 DEBUG_SetArrayParams(typeptr, 0, arr_max, subtype);
681 break;
682 case LF_FIELDLIST:
684 * This is where the basic list of fields is defined for
685 * structures and classes.
687 * First, we need to look ahead and see whether we are building
688 * a fieldlist for an enum or a struct.
690 ptr2.i = ptr.i + 1;
691 type2 = (union codeview_type *) ptr2.c;
692 if( type2->member.id == LF_MEMBER )
694 typeptr = DEBUG_NewDataType(DT_STRUCT, NULL);
695 fieldtype = DT_STRUCT;
697 else if( type2->member.id == LF_ENUMERATE )
699 typeptr = DEBUG_NewDataType(DT_ENUM, NULL);
700 fieldtype = DT_ENUM;
702 else
704 break;
707 cv_defined_types[curr_type - 0x1000] = typeptr;
708 while( ptr2.c < (ptr.c + ((type->generic.len + 3) & ~3)) )
710 type2 = (union codeview_type *) ptr2.c;
711 if( type2->member.id == LF_MEMBER && fieldtype == DT_STRUCT )
713 memset(symname, 0, sizeof(symname));
714 memcpy(symname, type2->member.name, type2->member.namelen);
716 subtype = DEBUG_GetCVType(type2->member.type);
717 elem_size = 0;
718 if( subtype != NULL )
720 elem_size = DEBUG_GetObjectSize(subtype);
723 if( type2->member.offset >= 0x8000 )
726 * This is a numeric leaf, I am too lazy to handle this right
727 * now.
729 fprintf(stderr, "Ignoring large numberic leaf.\n");
731 else
733 DEBUG_AddStructElement(typeptr, symname, subtype,
734 type2->member.offset << 3,
735 elem_size << 3);
738 else if( type2->member.id == LF_ENUMERATE && fieldtype == DT_ENUM )
740 memset(symname, 0, sizeof(symname));
741 memcpy(symname, type2->enumerate.name, type2->enumerate.namelen);
743 if( type2->enumerate.value >= 0x8000 )
746 * This is a numeric leaf, I am too lazy to handle this right
747 * now.
749 fprintf(stderr, "Ignoring large numberic leaf.\n");
751 else
753 DEBUG_AddStructElement(typeptr, symname, NULL,
754 type2->enumerate.value, 0);
757 else
760 * Something else I have never seen before. Either wrong type of
761 * object in the fieldlist, or some other problem which I wouldn't
762 * really know how to handle until it came up.
764 fprintf(stderr, "Unexpected entry in fieldlist\n");
765 break;
769 ptr2.c += ((type2->member.namelen + 9 + 3) & ~3);
771 break;
772 case LF_STRUCTURE:
773 case LF_CLASS:
774 if( type->structure.structlen >= 0x8000 )
777 * This is a numeric leaf, I am too lazy to handle this right
778 * now.
780 fprintf(stderr, "Ignoring large numberic leaf.\n");
781 break;
783 memset(symname, 0, sizeof(symname));
784 memcpy(symname, type->structure.name, type->structure.namelen);
785 if( strcmp(symname, "__unnamed") == 0 )
787 typeptr = DEBUG_NewDataType(DT_STRUCT, NULL);
789 else
791 typeptr = DEBUG_NewDataType(DT_STRUCT, symname);
793 cv_defined_types[curr_type - 0x1000] = typeptr;
796 * Now copy the relevant bits from the fieldlist that we specified.
798 subtype = DEBUG_GetCVType(type->structure.fieldlist);
800 if( subtype != NULL )
802 DEBUG_SetStructSize(typeptr, type->structure.structlen);
803 DEBUG_CopyFieldlist(typeptr, subtype);
805 break;
806 case LF_UNION:
807 if( type->t_union.un_len >= 0x8000 )
810 * This is a numeric leaf, I am too lazy to handle this right
811 * now.
813 fprintf(stderr, "Ignoring large numberic leaf.\n");
814 break;
816 memset(symname, 0, sizeof(symname));
817 memcpy(symname, type->t_union.name, type->t_union.namelen);
819 if( strcmp(symname, "__unnamed") == 0 )
821 typeptr = DEBUG_NewDataType(DT_STRUCT, NULL);
823 else
825 typeptr = DEBUG_NewDataType(DT_STRUCT, symname);
828 cv_defined_types[curr_type - 0x1000] = typeptr;
831 * Now copy the relevant bits from the fieldlist that we specified.
833 subtype = DEBUG_GetCVType(type->t_union.field);
835 if( subtype != NULL )
837 DEBUG_SetStructSize(typeptr, type->t_union.un_len);
838 DEBUG_CopyFieldlist(typeptr, subtype);
840 break;
841 case LF_BITFIELD:
842 typeptr = DEBUG_NewDataType(DT_BITFIELD, NULL);
843 cv_defined_types[curr_type - 0x1000] = typeptr;
844 DEBUG_SetBitfieldParams(typeptr, type->bitfield.bitoff,
845 type->bitfield.nbits,
846 DEBUG_GetCVType(type->bitfield.type));
847 break;
848 case LF_ENUMERATION:
849 memset(symname, 0, sizeof(symname));
850 memcpy(symname, type->enumeration.name, type->enumeration.namelen);
851 typeptr = DEBUG_NewDataType(DT_ENUM, symname);
852 cv_defined_types[curr_type - 0x1000] = typeptr;
855 * Now copy the relevant bits from the fieldlist that we specified.
857 subtype = DEBUG_GetCVType(type->enumeration.field);
859 if( subtype != NULL )
861 DEBUG_CopyFieldlist(typeptr, subtype);
863 break;
864 case LF_DIMARRAY:
865 default:
866 break;
868 curr_type++;
869 ptr.c += (type->generic.len + 3) & ~3;
872 return TRUE;
875 void
876 DEBUG_InitCVDataTypes()
879 * These are the common builtin types that are used by VC++.
881 cv_basic_types[T_NOTYPE] = NULL;
882 cv_basic_types[T_ABS] = NULL;
883 cv_basic_types[T_VOID] = DEBUG_NewDataType(DT_BASIC, "void");
884 cv_basic_types[T_CHAR] = DEBUG_NewDataType(DT_BASIC, "char");
885 cv_basic_types[T_SHORT] = DEBUG_NewDataType(DT_BASIC, "short int");
886 cv_basic_types[T_LONG] = DEBUG_NewDataType(DT_BASIC, "long int");
887 cv_basic_types[T_QUAD] = DEBUG_NewDataType(DT_BASIC, "long long int");
888 cv_basic_types[T_UCHAR] = DEBUG_NewDataType(DT_BASIC, "unsigned char");
889 cv_basic_types[T_USHORT] = DEBUG_NewDataType(DT_BASIC, "short unsigned int");
890 cv_basic_types[T_ULONG] = DEBUG_NewDataType(DT_BASIC, "long unsigned int");
891 cv_basic_types[T_UQUAD] = DEBUG_NewDataType(DT_BASIC, "long long unsigned int");
892 cv_basic_types[T_REAL32] = DEBUG_NewDataType(DT_BASIC, "float");
893 cv_basic_types[T_REAL64] = DEBUG_NewDataType(DT_BASIC, "double");
894 cv_basic_types[T_RCHAR] = DEBUG_NewDataType(DT_BASIC, "char");
895 cv_basic_types[T_WCHAR] = DEBUG_NewDataType(DT_BASIC, "short");
896 cv_basic_types[T_INT4] = DEBUG_NewDataType(DT_BASIC, "int");
897 cv_basic_types[T_UINT4] = DEBUG_NewDataType(DT_BASIC, "unsigned int");
899 cv_basic_types[T_32PVOID] = DEBUG_FindOrMakePointerType(cv_basic_types[T_VOID]);
900 cv_basic_types[T_32PCHAR] = DEBUG_FindOrMakePointerType(cv_basic_types[T_CHAR]);
901 cv_basic_types[T_32PSHORT] = DEBUG_FindOrMakePointerType(cv_basic_types[T_SHORT]);
902 cv_basic_types[T_32PLONG] = DEBUG_FindOrMakePointerType(cv_basic_types[T_LONG]);
903 cv_basic_types[T_32PQUAD] = DEBUG_FindOrMakePointerType(cv_basic_types[T_QUAD]);
904 cv_basic_types[T_32PUCHAR] = DEBUG_FindOrMakePointerType(cv_basic_types[T_UCHAR]);
905 cv_basic_types[T_32PUSHORT] = DEBUG_FindOrMakePointerType(cv_basic_types[T_USHORT]);
906 cv_basic_types[T_32PULONG] = DEBUG_FindOrMakePointerType(cv_basic_types[T_ULONG]);
907 cv_basic_types[T_32PUQUAD] = DEBUG_FindOrMakePointerType(cv_basic_types[T_UQUAD]);
908 cv_basic_types[T_32PREAL32] = DEBUG_FindOrMakePointerType(cv_basic_types[T_REAL32]);
909 cv_basic_types[T_32PREAL64] = DEBUG_FindOrMakePointerType(cv_basic_types[T_REAL64]);
910 cv_basic_types[T_32PRCHAR] = DEBUG_FindOrMakePointerType(cv_basic_types[T_RCHAR]);
911 cv_basic_types[T_32PWCHAR] = DEBUG_FindOrMakePointerType(cv_basic_types[T_WCHAR]);
912 cv_basic_types[T_32PINT4] = DEBUG_FindOrMakePointerType(cv_basic_types[T_INT4]);
913 cv_basic_types[T_32PUINT4] = DEBUG_FindOrMakePointerType(cv_basic_types[T_UINT4]);
917 * In this function, we keep track of deferred debugging information
918 * that we may need later if we were to need to use the internal debugger.
919 * We don't fully process it here for performance reasons.
922 DEBUG_RegisterDebugInfo( HMODULE hModule, const char *module_name)
924 int has_codeview = FALSE;
925 int rtn = FALSE;
926 int orig_size;
927 PIMAGE_DEBUG_DIRECTORY dbgptr;
928 u_long v_addr, size;
929 PIMAGE_NT_HEADERS nth = PE_HEADER(hModule);
931 size = nth->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size;
932 if (size) {
933 v_addr = nth->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress;
934 dbgptr = (PIMAGE_DEBUG_DIRECTORY) (hModule + v_addr);
935 orig_size = size;
936 for(; size >= sizeof(*dbgptr); size -= sizeof(*dbgptr), dbgptr++ )
938 switch(dbgptr->Type)
940 case IMAGE_DEBUG_TYPE_CODEVIEW:
941 case IMAGE_DEBUG_TYPE_MISC:
942 has_codeview = TRUE;
943 break;
947 size = orig_size;
948 dbgptr = (PIMAGE_DEBUG_DIRECTORY) (hModule + v_addr);
949 for(; size >= sizeof(*dbgptr); size -= sizeof(*dbgptr), dbgptr++ )
951 switch(dbgptr->Type)
953 case IMAGE_DEBUG_TYPE_COFF:
955 * If we have both codeview and COFF debug info, ignore the
956 * coff debug info as it would just confuse us, and it is
957 * less complete.
959 * FIXME - this is broken - if we cannot find the PDB file, then
960 * we end up with no debugging info at all. In this case, we
961 * should use the COFF info as a backup.
963 if( has_codeview )
965 break;
967 case IMAGE_DEBUG_TYPE_CODEVIEW:
968 case IMAGE_DEBUG_TYPE_MISC:
970 * This is usually an indirection to a .DBG file.
971 * This is similar to (but a slightly older format) from the
972 * PDB file.
974 * First check to see if the image was 'stripped'. If so, it
975 * means that this entry points to a .DBG file. Otherwise,
976 * it just points to itself, and we can ignore this.
984 if( (dbgptr->Type != IMAGE_DEBUG_TYPE_MISC) ||
985 (PE_HEADER(hModule)->FileHeader.Characteristics & IMAGE_FILE_DEBUG_STRIPPED) != 0 )
987 char fn[PATH_MAX];
988 int fd = -1;
989 DOS_FULL_NAME full_name;
990 struct deferred_debug_info* deefer = (struct deferred_debug_info *) xmalloc(sizeof(*deefer));
992 deefer->module = hModule;
993 deefer->load_addr = (char *)hModule;
996 * Read the important bits. What we do after this depends
997 * upon the type, but this is always enough so we are able
998 * to proceed if we know what we need to do next.
1000 /* basically, the PE loader maps all sections (data, resources...), but doesn't map
1001 * the DataDirectory array's content. One its entry contains the *beloved*
1002 * debug information. (Note the DataDirectory is mapped, not its content)
1005 if (GetModuleFileNameA(hModule, fn, sizeof(fn)) > 0 &&
1006 DOSFS_GetFullName(fn, TRUE, &full_name) &&
1007 (fd = open(full_name.long_name, O_RDONLY)) > 0)
1009 deefer->dbg_info = mmap(NULL, dbgptr->SizeOfData,
1010 PROT_READ, MAP_PRIVATE, fd, dbgptr->PointerToRawData);
1011 close(fd);
1012 if( deefer->dbg_info == (char *) 0xffffffff )
1014 free(deefer);
1015 break;
1018 else
1020 free(deefer);
1021 fprintf(stderr, " (not mapped: fn=%s, lfn=%s, fd=%d)", fn, full_name.long_name, fd);
1022 break;
1024 deefer->dbg_size = dbgptr->SizeOfData;
1025 deefer->dbgdir = dbgptr;
1026 deefer->next = dbglist;
1027 deefer->loaded = FALSE;
1028 deefer->dbg_index = DEBUG_next_index;
1029 deefer->module_name = xstrdup(module_name);
1031 deefer->sectp = PE_SECTIONS(hModule);
1032 deefer->nsect = PE_HEADER(hModule)->FileHeader.NumberOfSections;
1034 dbglist = deefer;
1036 break;
1037 default:
1040 DEBUG_next_index++;
1042 /* look for .stabs/.stabstr sections */
1044 PIMAGE_SECTION_HEADER pe_seg = PE_SECTIONS(hModule);
1045 int i,stabsize=0,stabstrsize=0;
1046 unsigned int stabs=0,stabstr=0;
1048 for (i=0;i<nth->FileHeader.NumberOfSections;i++) {
1049 if (!strcasecmp(pe_seg[i].Name,".stab")) {
1050 stabs = pe_seg[i].VirtualAddress;
1051 stabsize = pe_seg[i].SizeOfRawData;
1053 if (!strncasecmp(pe_seg[i].Name,".stabstr",8)) {
1054 stabstr = pe_seg[i].VirtualAddress;
1055 stabstrsize = pe_seg[i].SizeOfRawData;
1058 if (stabstrsize && stabsize) {
1059 #ifdef _WE_SUPPORT_THE_STAB_TYPES_USED_BY_MINGW_TOO
1060 /* Won't work currently, since MINGW32 uses some special typedefs
1061 * which we do not handle yet. Support for them is a bit difficult.
1063 DEBUG_ParseStabs(hModule,0,stabs,stabsize,stabstr,stabstrsize);
1064 #endif
1065 fprintf(stderr,"(stabs not loaded)");
1068 return (rtn);
1072 * ELF modules are also entered into the list - this is so that we
1073 * can make 'info shared' types of displays possible.
1076 DEBUG_RegisterELFDebugInfo(int load_addr, u_long size, char * name)
1078 struct deferred_debug_info * deefer;
1080 deefer = (struct deferred_debug_info *) xmalloc(sizeof(*deefer));
1081 deefer->module = 0;
1084 * Read the important bits. What we do after this depends
1085 * upon the type, but this is always enough so we are able
1086 * to proceed if we know what we need to do next.
1088 deefer->dbg_size = size;
1089 deefer->dbg_info = (char *) NULL;
1091 deefer->load_addr = (char *) load_addr;
1092 deefer->dbgdir = NULL;
1093 deefer->next = dbglist;
1094 deefer->loaded = TRUE;
1095 deefer->dbg_index = DEBUG_next_index;
1096 deefer->module_name = xstrdup(name);
1097 dbglist = deefer;
1099 DEBUG_next_index++;
1101 return (TRUE);
1107 * Process COFF debugging information embedded in a Win32 application.
1110 static
1112 DEBUG_ProcessCoff(struct deferred_debug_info * deefer)
1114 struct CoffAuxSection * aux;
1115 struct CoffDebug * coff;
1116 struct CoffFiles * coff_files = NULL;
1117 struct CoffLinenum * coff_linetab;
1118 char * coff_strtab;
1119 struct CoffSymbol * coff_sym;
1120 struct CoffSymbol * coff_symbol;
1121 struct CoffFiles * curr_file = NULL;
1122 int i;
1123 int j;
1124 int k;
1125 struct CoffLinenum * linepnt;
1126 int linetab_indx;
1127 char namebuff[9];
1128 char * nampnt;
1129 int naux;
1130 DBG_ADDR new_addr;
1131 int nfiles = 0;
1132 int nfiles_alloc = 0;
1133 struct CoffFiles orig_file;
1134 int rtn = FALSE;
1135 char * this_file = NULL;
1137 coff = (struct CoffDebug *) deefer->dbg_info;
1139 coff_symbol = (struct CoffSymbol *) ((unsigned int) coff + coff->SymbolOffset);
1140 coff_linetab = (struct CoffLinenum *) ((unsigned int) coff + coff->LinenumberOffset);
1141 coff_strtab = (char *) ((unsigned int) coff_symbol + 18*coff->N_Sym);
1143 linetab_indx = 0;
1145 for(i=0; i < coff->N_Sym; i++ )
1148 * We do this because some compilers (i.e. gcc) incorrectly
1149 * pad the structure up to a 4 byte boundary. The structure
1150 * is really only 18 bytes long, so we have to manually make sure
1151 * we get it right.
1153 * FIXME - there must be a way to have autoconf figure out the
1154 * correct compiler option for this. If it is always gcc, that
1155 * makes life simpler, but I don't want to force this.
1157 coff_sym = (struct CoffSymbol *) ((unsigned int) coff_symbol + 18*i);
1158 naux = coff_sym->NumberOfAuxSymbols;
1160 if( coff_sym->StorageClass == IMAGE_SYM_CLASS_FILE )
1162 if( nfiles + 1 >= nfiles_alloc )
1164 nfiles_alloc += 10;
1165 coff_files = (struct CoffFiles *) realloc( coff_files,
1166 nfiles_alloc * sizeof(struct CoffFiles));
1168 curr_file = coff_files + nfiles;
1169 nfiles++;
1170 curr_file->startaddr = 0xffffffff;
1171 curr_file->endaddr = 0;
1172 curr_file->filename = ((char *) coff_sym) + 18;
1173 curr_file->linetab_offset = -1;
1174 curr_file->linecnt = 0;
1175 curr_file->entries = NULL;
1176 curr_file->neps = curr_file->neps_alloc = 0;
1177 #if 0
1178 fprintf(stderr,"New file %s\n", curr_file->filename);
1179 #endif
1180 i += naux;
1181 continue;
1185 * This guy marks the size and location of the text section
1186 * for the current file. We need to keep track of this so
1187 * we can figure out what file the different global functions
1188 * go with.
1190 if( (coff_sym->StorageClass == IMAGE_SYM_CLASS_STATIC)
1191 && (naux != 0)
1192 && (coff_sym->Type == 0)
1193 && (coff_sym->SectionNumber == 1) )
1195 aux = (struct CoffAuxSection *) ((unsigned int) coff_sym + 18);
1197 if( curr_file->linetab_offset != -1 )
1199 #if 0
1200 fprintf(stderr, "Duplicating sect from %s: %x %x %x %d %d\n",
1201 curr_file->filename,
1202 aux->Length,
1203 aux->NumberOfRelocations,
1204 aux->NumberOfLinenumbers,
1205 aux->Number,
1206 aux->Selection);
1207 fprintf(stderr, "More sect %d %x %d %d %d\n",
1208 coff_sym->SectionNumber,
1209 coff_sym->Value,
1210 coff_sym->Type,
1211 coff_sym->StorageClass,
1212 coff_sym->NumberOfAuxSymbols);
1213 #endif
1216 * Save this so we can copy bits from it.
1218 orig_file = *curr_file;
1221 * Duplicate the file entry. We have no way to describe
1222 * multiple text sections in our current way of handling things.
1224 if( nfiles + 1 >= nfiles_alloc )
1226 nfiles_alloc += 10;
1227 coff_files = (struct CoffFiles *) realloc( coff_files,
1228 nfiles_alloc * sizeof(struct CoffFiles));
1230 curr_file = coff_files + nfiles;
1231 nfiles++;
1232 curr_file->startaddr = 0xffffffff;
1233 curr_file->endaddr = 0;
1234 curr_file->filename = orig_file.filename;
1235 curr_file->linetab_offset = -1;
1236 curr_file->linecnt = 0;
1237 curr_file->entries = NULL;
1238 curr_file->neps = curr_file->neps_alloc = 0;
1240 #if 0
1241 else
1243 fprintf(stderr, "New text sect from %s: %x %x %x %d %d\n",
1244 curr_file->filename,
1245 aux->Length,
1246 aux->NumberOfRelocations,
1247 aux->NumberOfLinenumbers,
1248 aux->Number,
1249 aux->Selection);
1251 #endif
1253 if( curr_file->startaddr > coff_sym->Value )
1255 curr_file->startaddr = coff_sym->Value;
1258 if( curr_file->startaddr > coff_sym->Value )
1260 curr_file->startaddr = coff_sym->Value;
1263 if( curr_file->endaddr < coff_sym->Value + aux->Length )
1265 curr_file->endaddr = coff_sym->Value + aux->Length;
1268 curr_file->linetab_offset = linetab_indx;
1269 curr_file->linecnt = aux->NumberOfLinenumbers;
1270 linetab_indx += aux->NumberOfLinenumbers;
1271 i += naux;
1272 continue;
1275 if( (coff_sym->StorageClass == IMAGE_SYM_CLASS_STATIC)
1276 && (naux == 0)
1277 && (coff_sym->SectionNumber == 1) )
1280 * This is a normal static function when naux == 0.
1281 * Just register it. The current file is the correct
1282 * one in this instance.
1284 if( coff_sym->N.Name.NotLong )
1286 memcpy(namebuff, coff_sym->N.ShortName, 8);
1287 namebuff[8] = '\0';
1288 nampnt = &namebuff[0];
1290 else
1292 nampnt = coff_strtab + coff_sym->N.Name.StrTaboff;
1295 if( nampnt[0] == '_' )
1297 nampnt++;
1300 new_addr.seg = 0;
1301 new_addr.off = (int) (deefer->load_addr + coff_sym->Value);
1303 if( curr_file->neps + 1 >= curr_file->neps_alloc )
1305 curr_file->neps_alloc += 10;
1306 curr_file->entries = (struct name_hash **)
1307 realloc( curr_file->entries,
1308 curr_file->neps_alloc * sizeof(struct name_hash *));
1310 #if 0
1311 fprintf(stderr,"\tAdding static symbol %s\n", nampnt);
1312 #endif
1313 curr_file->entries[curr_file->neps++] =
1314 DEBUG_AddSymbol( nampnt, &new_addr, this_file, SYM_WIN32 );
1315 i += naux;
1316 continue;
1319 if( (coff_sym->StorageClass == IMAGE_SYM_CLASS_EXTERNAL)
1320 && ISFCN(coff_sym->Type)
1321 && (coff_sym->SectionNumber > 0) )
1323 if( coff_sym->N.Name.NotLong )
1325 memcpy(namebuff, coff_sym->N.ShortName, 8);
1326 namebuff[8] = '\0';
1327 nampnt = &namebuff[0];
1329 else
1331 nampnt = coff_strtab + coff_sym->N.Name.StrTaboff;
1335 if( nampnt[0] == '_' )
1337 nampnt++;
1340 new_addr.seg = 0;
1341 new_addr.off = (int) (deefer->load_addr + coff_sym->Value);
1343 #if 0
1344 fprintf(stderr, "%d: %x %s\n", i, new_addr.off, nampnt);
1346 fprintf(stderr,"\tAdding global symbol %s\n", nampnt);
1347 #endif
1350 * Now we need to figure out which file this guy belongs to.
1352 this_file = NULL;
1353 for(j=0; j < nfiles; j++)
1355 if( coff_files[j].startaddr <= coff_sym->Value
1356 && coff_files[j].endaddr > coff_sym->Value )
1358 this_file = coff_files[j].filename;
1359 break;
1362 if( coff_files[j].neps + 1 >= coff_files[j].neps_alloc )
1364 coff_files[j].neps_alloc += 10;
1365 coff_files[j].entries = (struct name_hash **)
1366 realloc( coff_files[j].entries,
1367 coff_files[j].neps_alloc * sizeof(struct name_hash *));
1369 coff_files[j].entries[coff_files[j].neps++] =
1370 DEBUG_AddSymbol( nampnt, &new_addr, this_file, SYM_WIN32 );
1371 i += naux;
1372 continue;
1375 if( (coff_sym->StorageClass == IMAGE_SYM_CLASS_EXTERNAL)
1376 && (coff_sym->SectionNumber > 0) )
1379 * Similar to above, but for the case of data symbols.
1380 * These aren't treated as entrypoints.
1382 if( coff_sym->N.Name.NotLong )
1384 memcpy(namebuff, coff_sym->N.ShortName, 8);
1385 namebuff[8] = '\0';
1386 nampnt = &namebuff[0];
1388 else
1390 nampnt = coff_strtab + coff_sym->N.Name.StrTaboff;
1394 if( nampnt[0] == '_' )
1396 nampnt++;
1399 new_addr.seg = 0;
1400 new_addr.off = (int) (deefer->load_addr + coff_sym->Value);
1402 #if 0
1403 fprintf(stderr, "%d: %x %s\n", i, new_addr.off, nampnt);
1405 fprintf(stderr,"\tAdding global data symbol %s\n", nampnt);
1406 #endif
1409 * Now we need to figure out which file this guy belongs to.
1411 DEBUG_AddSymbol( nampnt, &new_addr, NULL, SYM_WIN32 );
1412 i += naux;
1413 continue;
1416 if( (coff_sym->StorageClass == IMAGE_SYM_CLASS_STATIC)
1417 && (naux == 0) )
1420 * Ignore these. They don't have anything to do with
1421 * reality.
1423 i += naux;
1424 continue;
1427 #if 0
1428 fprintf(stderr,"Skipping unknown entry %d %d %d\n", coff_sym->StorageClass,
1429 coff_sym->SectionNumber, naux);
1430 #endif
1433 * For now, skip past the aux entries.
1435 i += naux;
1440 * OK, we now should have a list of files, and we should have a list
1441 * of entrypoints. We need to sort the entrypoints so that we are
1442 * able to tie the line numbers with the given functions within the
1443 * file.
1445 if( coff_files != NULL )
1447 for(j=0; j < nfiles; j++)
1449 if( coff_files[j].entries != NULL )
1451 qsort(coff_files[j].entries, coff_files[j].neps,
1452 sizeof(struct name_hash *), DEBUG_cmp_sym);
1457 * Now pick apart the line number tables, and attach the entries
1458 * to the given functions.
1460 for(j=0; j < nfiles; j++)
1462 i = 0;
1463 if( coff_files[j].neps != 0 )
1464 for(k=0; k < coff_files[j].linecnt; k++)
1467 * Another monstrosity caused by the fact that we are using
1468 * a 6 byte structure, and gcc wants to pad structures to 4 byte
1469 * boundaries. Otherwise we could just index into an array.
1471 linepnt = (struct CoffLinenum *)
1472 ((unsigned int) coff_linetab +
1473 6*(coff_files[j].linetab_offset + k));
1475 * If we have spilled onto the next entrypoint, then
1476 * bump the counter..
1478 while(TRUE)
1480 if (i+1 >= coff_files[j].neps) break;
1481 DEBUG_GetSymbolAddr(coff_files[j].entries[i+1], &new_addr);
1482 if( (((unsigned int)deefer->load_addr +
1483 linepnt->VirtualAddr) >= new_addr.off) )
1485 i++;
1486 } else break;
1490 * Add the line number. This is always relative to the
1491 * start of the function, so we need to subtract that offset
1492 * first.
1494 DEBUG_GetSymbolAddr(coff_files[j].entries[i], &new_addr);
1495 DEBUG_AddLineNumber(coff_files[j].entries[i],
1496 linepnt->Linenum,
1497 (unsigned int) deefer->load_addr
1498 + linepnt->VirtualAddr
1499 - new_addr.off);
1504 rtn = TRUE;
1506 if( coff_files != NULL )
1508 for(j=0; j < nfiles; j++)
1510 if( coff_files[j].entries != NULL )
1512 free(coff_files[j].entries);
1515 free(coff_files);
1518 return (rtn);
1523 * Process a codeview line number table. Digestify the thing so that
1524 * we can easily reference the thing when we process the rest of
1525 * the information.
1527 static struct codeview_linetab_hdr *
1528 DEBUG_SnarfLinetab(char * linetab,
1529 int size)
1531 int file_segcount;
1532 char filename[PATH_MAX];
1533 unsigned int * filetab;
1534 char * fn;
1535 int i;
1536 int k;
1537 struct codeview_linetab_hdr * lt_hdr;
1538 unsigned int * lt_ptr;
1539 int nfile;
1540 int nseg;
1541 union any_size pnt;
1542 union any_size pnt2;
1543 struct startend * start;
1544 int this_seg;
1547 * Now get the important bits.
1549 pnt = (union any_size) linetab;
1550 nfile = *pnt.s++;
1551 nseg = *pnt.s++;
1553 filetab = (unsigned int *) pnt.c;
1556 * Now count up the number of segments in the file.
1558 nseg = 0;
1559 for(i=0; i<nfile; i++)
1561 pnt2 = (union any_size) (linetab + filetab[i]);
1562 nseg += *pnt2.s;
1566 * Next allocate the header we will be returning.
1567 * There is one header for each segment, so that we can reach in
1568 * and pull bits as required.
1570 lt_hdr = (struct codeview_linetab_hdr *)
1571 xmalloc((nseg + 1) * sizeof(*lt_hdr));
1572 if( lt_hdr == NULL )
1574 goto leave;
1577 memset(lt_hdr, 0, sizeof(*lt_hdr) * (nseg+1));
1580 * Now fill the header we will be returning, one for each segment.
1581 * Note that this will basically just contain pointers into the existing
1582 * line table, and we do not actually copy any additional information
1583 * or allocate any additional memory.
1586 this_seg = 0;
1587 for(i=0; i<nfile; i++)
1590 * Get the pointer into the segment information.
1592 pnt2 = (union any_size) (linetab + filetab[i]);
1593 file_segcount = *pnt2.s;
1595 pnt2.ui++;
1596 lt_ptr = (unsigned int *) pnt2.c;
1597 start = (struct startend *) (lt_ptr + file_segcount);
1600 * Now snarf the filename for all of the segments for this file.
1602 fn = (unsigned char *) (start + file_segcount);
1603 memset(filename, 0, sizeof(filename));
1604 memcpy(filename, fn + 1, *fn);
1605 fn = strdup(filename);
1607 for(k = 0; k < file_segcount; k++, this_seg++)
1609 pnt2 = (union any_size) (linetab + lt_ptr[k]);
1610 lt_hdr[this_seg].start = start[k].start;
1611 lt_hdr[this_seg].end = start[k].end;
1612 lt_hdr[this_seg].sourcefile = fn;
1613 lt_hdr[this_seg].segno = *pnt2.s++;
1614 lt_hdr[this_seg].nline = *pnt2.s++;
1615 lt_hdr[this_seg].offtab = pnt2.ui;
1616 lt_hdr[this_seg].linetab = (unsigned short *)
1617 (pnt2.ui + lt_hdr[this_seg].nline);
1621 leave:
1623 return lt_hdr;
1627 static int
1628 DEBUG_SnarfCodeView( struct deferred_debug_info * deefer,
1629 char * cv_data,
1630 int size,
1631 struct codeview_linetab_hdr * linetab)
1633 struct name_hash * curr_func = NULL;
1634 struct wine_locals * curr_sym = NULL;
1635 int i;
1636 int j;
1637 int len;
1638 DBG_ADDR new_addr;
1639 int nsect;
1640 union any_size ptr;
1641 IMAGE_SECTION_HEADER * sectp;
1642 union codeview_symbol * sym;
1643 char symname[PATH_MAX];
1644 struct name_hash * thunk_sym = NULL;
1646 ptr = (union any_size) cv_data;
1647 nsect = deefer->nsect;
1648 sectp = deefer->sectp;
1651 * Skip over the first word. Don't really know what it means, but
1652 * it is useless.
1654 ptr.ui++;
1657 * Loop over the different types of records and whenever we
1658 * find something we are interested in, record it and move on.
1660 while( ptr.c - cv_data < size )
1662 sym = (union codeview_symbol *) ptr.c;
1664 if( sym->generic.len - sizeof(int) == (ptr.c - cv_data) )
1667 * This happens when we have indirect symbols that VC++ 4.2
1668 * sometimes uses when there isn't a line number table.
1669 * We ignore it - we will process and enter all of the
1670 * symbols in the global symbol table anyways, so there
1671 * isn't much point in keeping track of all of this crap.
1673 break;
1676 memset(symname, 0, sizeof(symname));
1677 switch(sym->generic.id)
1679 case S_GDATA:
1680 case S_LDATA:
1681 case S_PUB:
1683 * First, a couple of sanity checks.
1685 if( sym->data.namelen == 0 )
1687 break;
1690 if( sym->data.seg == 0 || sym->data.seg > nsect )
1692 break;
1696 * Global and local data symbols. We don't associate these
1697 * with any given source file.
1700 memcpy(symname, sym->data.name, sym->data.namelen);
1701 new_addr.seg = 0;
1702 new_addr.type = DEBUG_GetCVType(sym->data.symtype);
1703 new_addr.off = (unsigned int) deefer->load_addr +
1704 sectp[sym->data.seg - 1].VirtualAddress +
1705 sym->data.offset;
1706 DEBUG_AddSymbol( symname, &new_addr, NULL, SYM_WIN32 | SYM_DATA );
1707 break;
1708 case S_THUNK:
1710 * Sort of like a global function, but it just points
1711 * to a thunk, which is a stupid name for what amounts to
1712 * a PLT slot in the normal jargon that everyone else uses.
1714 memcpy(symname, sym->thunk.name, sym->thunk.namelen);
1715 new_addr.seg = 0;
1716 new_addr.type = NULL;
1717 new_addr.off = (unsigned int) deefer->load_addr +
1718 sectp[sym->thunk.segment - 1].VirtualAddress +
1719 sym->thunk.offset;
1720 thunk_sym = DEBUG_AddSymbol( symname, &new_addr, NULL,
1721 SYM_WIN32 | SYM_FUNC);
1722 DEBUG_SetSymbolSize(thunk_sym, sym->thunk.thunk_len);
1723 break;
1724 case S_GPROC:
1725 case S_LPROC:
1727 * Global and static functions.
1729 memcpy(symname, sym->proc.name, sym->proc.namelen);
1730 new_addr.seg = 0;
1731 new_addr.type = DEBUG_GetCVType(sym->proc.proctype);
1732 new_addr.off = (unsigned int) deefer->load_addr +
1733 sectp[sym->proc.segment - 1].VirtualAddress +
1734 sym->proc.offset;
1736 * See if we can find a segment that this goes with. If so,
1737 * it means that we also may have line number information
1738 * for this function.
1740 for(i=0; linetab[i].linetab != NULL; i++)
1742 if( ((unsigned int) deefer->load_addr
1743 + sectp[linetab[i].segno - 1].VirtualAddress
1744 + linetab[i].start <= new_addr.off)
1745 && ((unsigned int) deefer->load_addr
1746 + sectp[linetab[i].segno - 1].VirtualAddress
1747 + linetab[i].end > new_addr.off) )
1749 break;
1753 DEBUG_Normalize(curr_func);
1754 if( linetab[i].linetab == NULL )
1756 curr_func = DEBUG_AddSymbol( symname, &new_addr, NULL,
1757 SYM_WIN32 | SYM_FUNC);
1759 else
1762 * First, create the entry. Then dig through the linetab
1763 * and add whatever line numbers are appropriate for this
1764 * function.
1766 curr_func = DEBUG_AddSymbol( symname, &new_addr,
1767 linetab[i].sourcefile,
1768 SYM_WIN32 | SYM_FUNC);
1769 for(j=0; j < linetab[i].nline; j++)
1771 if( linetab[i].offtab[j] >= sym->proc.offset
1772 && linetab[i].offtab[j] < sym->proc.offset
1773 + sym->proc.proc_len )
1775 DEBUG_AddLineNumber(curr_func, linetab[i].linetab[j],
1776 linetab[i].offtab[j] - sym->proc.offset);
1783 * Add information about where we should set breakpoints
1784 * in this function.
1786 DEBUG_SetSymbolBPOff(curr_func, sym->proc.debug_start);
1787 DEBUG_SetSymbolSize(curr_func, sym->proc.proc_len);
1788 break;
1789 case S_BPREL:
1791 * Function parameters and stack variables.
1793 memcpy(symname, sym->stack.name, sym->stack.namelen);
1794 curr_sym = DEBUG_AddLocal(curr_func,
1796 sym->stack.offset,
1799 symname);
1800 DEBUG_SetLocalSymbolType(curr_sym, DEBUG_GetCVType(sym->stack.symtype));
1802 break;
1803 default:
1804 break;
1808 * Adjust pointer to point to next entry, rounding up to a word
1809 * boundary. MS preserving alignment? Stranger things have
1810 * happened.
1812 if( sym->generic.id == S_PROCREF
1813 || sym->generic.id == S_DATAREF
1814 || sym->generic.id == S_UNKNOWN )
1816 len = (sym->generic.len + 3) & ~3;
1817 len += ptr.c[16] + 1;
1818 ptr.c += (len + 3) & ~3;
1820 else
1822 ptr.c += (sym->generic.len + 3) & ~3;
1826 if( linetab != NULL )
1828 free(linetab);
1831 return TRUE;
1836 * Process PDB file which contains debug information.
1838 * These are really weird beasts. They are intended to be incrementally
1839 * updated by the incremental linker, and this means that you need to
1840 * be able to remove and add information. Thus the PDB file is sort of
1841 * like a block structured device, with a freelist and lists of extent numbers
1842 * that are used to get the relevant pieces. In all cases seen so far, the
1843 * blocksize is always 0x400 bytes. The header has a field which apparently
1844 * holds the blocksize, so if it ever changes we are safe.
1846 * In general, every time we need to extract something from the pdb file,
1847 * it is easier to copy it into another buffer so we have the information
1848 * in one contiguous block rather than attempt to try and keep track of when
1849 * we need to grab another extent from the pdb file.
1851 * The thing that is a real pain about some MS stuff is that they choose
1852 * data structures which are not representable in C. Thus we have to
1853 * hack around and diddle pointers.
1855 /* static */
1857 DEBUG_ProcessPDBFile(struct deferred_debug_info * deefer, char * full_filename)
1859 char * addr = (char *) 0xffffffff;
1860 unsigned int blocksize;
1861 unsigned int bufflen = 0;
1862 char * buffer = NULL;
1863 unsigned short * extent_table;
1864 int fd = -1;
1865 struct file_ent * fent;
1866 char filename[MAX_PATHNAME_LEN];
1867 struct file_list * filelist = NULL;
1868 unsigned int gsym_record = 0;
1869 char * gsymtab = NULL;
1870 struct filetab_hdr * hd;
1871 int i;
1872 int j;
1873 unsigned int last_extent;
1874 struct codeview_linetab_hdr * linetab;
1875 unsigned int nblocks;
1876 unsigned int npair;
1877 unsigned int offset;
1878 struct codeview_pdb_hdr * pdbhdr;
1879 unsigned int * pnt;
1880 struct stat statbuf;
1881 int status;
1882 unsigned short * table;
1883 char * toc;
1884 unsigned int toc_blocks;
1886 LocateDebugInfoFile(full_filename, filename);
1887 status = stat(filename, &statbuf);
1888 if( status == -1 )
1890 fprintf(stderr, "-Unable to open .PDB file %s\n", filename);
1891 goto leave;
1895 * Now open the file, so that we can mmap() it.
1897 fd = open(filename, O_RDONLY);
1898 if( fd == -1 )
1900 fprintf(stderr, "-Unable to open .DBG file %s\n", filename);
1901 goto leave;
1906 * Now mmap() the file.
1908 addr = mmap(0, statbuf.st_size, PROT_READ,
1909 MAP_PRIVATE, fd, 0);
1910 if( addr == (char *) 0xffffffff )
1912 fprintf(stderr, "-Unable to mmap .DBG file %s\n", filename);
1913 goto leave;
1917 * Now that we have the formalities over and done with, we need
1918 * to find the table of contents for the PDB file.
1920 pdbhdr = (struct codeview_pdb_hdr *) addr;
1921 blocksize = pdbhdr->blocksize;
1922 last_extent = (statbuf.st_size + blocksize - 1) / blocksize;
1925 * The TOC itself isn't always contiguous, so we need to extract a few
1926 * extents from the file to form the TOC.
1928 toc_blocks = (pdbhdr->toc_len + blocksize - 1) / blocksize;
1929 toc = (char *) xmalloc(toc_blocks * blocksize);
1930 table = pdbhdr->toc_ext;
1931 for(i=0; i < toc_blocks; i++)
1933 memcpy(toc + blocksize*i, addr + table[i]*blocksize, blocksize);
1937 * Next build our own table which will have the size and extent block
1938 * list for each record in the PDB file.
1940 * The TOC starts out with the number of files. Then it is followed by
1941 * (npair * 2*sizeof(int)) bytes of information, which are pairs of ints.
1942 * The first one is the size of the record (in bytes), and the second one
1943 * is something else which I haven't figured out yet.
1945 pnt = (unsigned int *) toc;
1946 npair = *pnt++;
1947 extent_table = (unsigned short *) ((unsigned int) toc +
1948 npair * 2 * sizeof(int) + sizeof(int));
1951 * Sanity check.
1953 if( sizeof(int) + 2*sizeof(int)*npair > pdbhdr->toc_len )
1955 goto leave;
1958 filelist = (struct file_list *) xmalloc(npair * sizeof(*filelist));
1959 if( filelist == NULL )
1961 goto leave;
1963 memset(filelist, 0, npair * sizeof(*filelist));
1965 nblocks = 0;
1966 for(i=0; i < npair; i++)
1968 filelist[i].record_len = pnt[i*2];
1969 filelist[i].nextents = (filelist[i].record_len + blocksize - 1)
1970 / blocksize;
1971 filelist[i].extent_list = extent_table + nblocks;
1972 nblocks += filelist[i].nextents;
1975 * These get filled in later when we parse one of the records.
1977 filelist[i].linetab_offset = 0;
1978 filelist[i].linetab_len = 0;
1982 * OK, now walk through the various records and pick out the bits we
1983 * really want to see. Some of the records are extra special, and
1984 * we need to handle these a little bit differently.
1986 for(i=0; i < npair; i++)
1988 if( filelist[i].record_len == 0xffffffff )
1990 continue;
1994 * Make sure our buffer is large enough to hold the record.
1996 if( bufflen < filelist[i].nextents * blocksize )
1998 bufflen = filelist[i].nextents * blocksize;
1999 buffer = (char *) realloc(buffer, bufflen);
2003 * Do this just for completeness. It makes debugging easier
2004 * if we have a clean indication of where the record ends.
2006 memset(buffer, 0, filelist[i].nextents * blocksize);
2009 * Next, build the record using the extent list.
2011 for(j=0; j < filelist[i].nextents; j++)
2013 memcpy(buffer + j * blocksize,
2014 addr + filelist[i].extent_list[j] * blocksize,
2015 blocksize);
2018 pnt = (unsigned int *) buffer;
2021 * OK, now figure out what to do with it.
2025 * Always ignore the first entry. It seems to contain a backup copy
2026 * of the TOC (the last time the file was modified??)
2028 if( i == 0 )
2030 continue;
2034 * The second entry as a id block. It contains a magic number
2035 * to identify the compiler, plus it also contains the timestamp
2036 * which must match the timestamp in the executable.
2038 if( i == 1 )
2041 if( ((*pnt != 19950623) && (*pnt != 19950814))
2042 || (filelist[i].record_len != 0x24)
2043 || (pnt[1] != ((struct CodeViewDebug *)(deefer->dbg_info))->cv_timestamp) )
2045 goto leave;
2050 * The third entry contains pointers to the global symbol table,
2051 * plus it also contains additional information about each record
2052 * in the PDB file.
2054 if( i == 3 )
2056 hd = (struct filetab_hdr *) buffer;
2058 gsym_record = hd->gsym_file;
2059 gsymtab = (char *) xmalloc( filelist[gsym_record].nextents
2060 * blocksize);
2061 memset(gsymtab, 0, filelist[gsym_record].nextents * blocksize);
2063 for(j=0; j < filelist[gsym_record].nextents; j++)
2065 memcpy(gsymtab + j * blocksize,
2066 addr + filelist[gsym_record].extent_list[j] * blocksize,
2067 blocksize);
2071 * This record also contains information about where in the
2072 * remaining records we will be able to find the start of the
2073 * line number table. We could locate that bit using heuristics,
2074 * but since we have the info handy, we might as well use it.
2076 offset = sizeof(*hd);
2077 while(1==1)
2079 fent = (struct file_ent *) (buffer + offset);
2080 if( offset > hd->ftab_len )
2082 break;
2085 if( fent->file_number == 0 || fent->file_number >= npair )
2087 break;
2090 filelist[fent->file_number].linetab_offset =
2091 fent->linetab_offset;
2092 filelist[fent->file_number].linetab_len =
2093 fent->linetab_len;
2095 * Figure out the offset of the next entry.
2096 * There is a fixed part of the record and a variable
2097 * length filename which we must also skip past.
2099 offset += ((unsigned int) &fent->filename - (unsigned int) fent)
2100 + strlen(fent->filename) + 1;
2101 offset += strlen(buffer+offset) + 1;
2102 offset = (offset + 3) & ~3;
2108 * Two different magic numbers used as dates.
2109 * These indicate the 'type' table.
2111 if( *pnt == 19950410
2112 || *pnt == 19951122 )
2114 DEBUG_ParseTypeTable(buffer, filelist[i].record_len);
2115 continue;
2119 * This is something we really want to look at, since it contains
2120 * real debug info. Anything that doesn't match this can be
2121 * ignored for now.
2123 if( *pnt == 1 )
2126 * First, snag the line table, if we have one. This always
2127 * occurs at the end of the record, so we take the linetab
2128 * offset as the end of the normal part of the record.
2130 linetab = NULL;
2131 if( filelist[i].linetab_len != 0 )
2133 linetab = DEBUG_SnarfLinetab(buffer + filelist[i].linetab_offset,
2134 filelist[i].linetab_len);
2135 DEBUG_SnarfCodeView(deefer, buffer,
2136 filelist[i].linetab_offset,
2137 linetab);
2139 else
2141 DEBUG_SnarfCodeView(deefer, buffer,
2142 filelist[i].record_len,
2143 linetab);
2145 continue;
2150 * Finally, process the global symbol table itself. There isn't
2151 * a line number component to this, so we just toss everything
2152 * into the mix and it all should work out.
2154 if( gsym_record != 0 )
2156 DEBUG_SnarfCodeView(deefer, gsymtab - sizeof(int),
2157 filelist[gsym_record].record_len,
2158 NULL);
2161 leave:
2163 if( gsymtab != NULL )
2165 free(gsymtab);
2166 gsymtab = NULL;
2169 if( buffer != NULL )
2171 free(buffer);
2174 if( filelist != NULL )
2176 free(filelist);
2179 if( addr != (char *) 0xffffffff )
2181 munmap(addr, statbuf.st_size);
2184 if( fd != -1 )
2186 close(fd);
2189 return TRUE;
2193 * Process DBG file which contains debug information.
2195 /* static */
2197 DEBUG_ProcessDBGFile(struct deferred_debug_info * deefer, char * filename)
2199 char * addr = (char *) 0xffffffff;
2200 char * codeview;
2201 struct CV4_DirHead * codeview_dir;
2202 struct CV4_DirEnt * codeview_dent;
2203 PIMAGE_DEBUG_DIRECTORY dbghdr;
2204 struct deferred_debug_info deefer2;
2205 int fd = -1;
2206 int i;
2207 int j;
2208 struct codeview_linetab_hdr * linetab;
2209 int nsect;
2210 PIMAGE_SEPARATE_DEBUG_HEADER pdbg = NULL;
2211 IMAGE_SECTION_HEADER * sectp;
2212 struct stat statbuf;
2213 int status;
2214 char dbg_file[MAX_PATHNAME_LEN];
2216 LocateDebugInfoFile(filename, dbg_file);
2217 status = stat(dbg_file, &statbuf);
2218 if( status == -1 )
2220 fprintf(stderr, "-Unable to open .DBG file %s\n", dbg_file);
2221 goto leave;
2225 * Now open the file, so that we can mmap() it.
2227 fd = open(dbg_file, O_RDONLY);
2228 if( fd == -1 )
2230 fprintf(stderr, "Unable to open .DBG file %s\n", dbg_file);
2231 goto leave;
2236 * Now mmap() the file.
2238 addr = mmap(0, statbuf.st_size, PROT_READ,
2239 MAP_PRIVATE, fd, 0);
2240 if( addr == (char *) 0xffffffff )
2242 fprintf(stderr, "Unable to mmap .DBG file %s\n", dbg_file);
2243 goto leave;
2246 pdbg = (PIMAGE_SEPARATE_DEBUG_HEADER) addr;
2248 if( pdbg->TimeDateStamp != deefer->dbgdir->TimeDateStamp )
2250 fprintf(stderr, "Warning - %s has incorrect internal timestamp\n",
2251 dbg_file);
2252 /* goto leave; */
2254 Well, sometimes this happens to DBG files which ARE REALLY the right .DBG
2255 files but nonetheless this check fails. Anyway, WINDBG (debugger for
2256 Windows by Microsoft) loads debug symbols which have incorrect timestamps.
2260 fprintf(stderr, "Processing symbols from %s...\n", dbg_file);
2262 dbghdr = (PIMAGE_DEBUG_DIRECTORY) ( addr + sizeof(*pdbg)
2263 + pdbg->NumberOfSections * sizeof(IMAGE_SECTION_HEADER)
2264 + pdbg->ExportedNamesSize);
2266 sectp = (PIMAGE_SECTION_HEADER) ((char *) pdbg + sizeof(*pdbg));
2267 nsect = pdbg->NumberOfSections;
2269 for( i=0; i < pdbg->DebugDirectorySize / sizeof(*pdbg); i++, dbghdr++ )
2271 switch(dbghdr->Type)
2273 case IMAGE_DEBUG_TYPE_COFF:
2275 * Dummy up a deferred debug header to handle the
2276 * COFF stuff embedded within the DBG file.
2278 memset((char *) &deefer2, 0, sizeof(deefer2));
2279 deefer2.dbg_info = (addr + dbghdr->PointerToRawData);
2280 deefer2.dbg_size = dbghdr->SizeOfData;
2281 deefer2.load_addr = deefer->load_addr;
2283 DEBUG_ProcessCoff(&deefer2);
2284 break;
2285 case IMAGE_DEBUG_TYPE_CODEVIEW:
2287 * This is the older format by which codeview stuff is
2288 * stored, known as the 'NB09' format. Newer executables
2289 * and dlls created by VC++ use PDB files instead, which
2290 * have lots of internal similarities, but the overall
2291 * format and structure is quite different.
2293 codeview = (addr + dbghdr->PointerToRawData);
2296 * The first thing in the codeview section should be
2297 * an 'NB09' identifier. As a sanity check, make sure
2298 * it is there.
2300 if( *((unsigned int*) codeview) != 0x3930424e )
2302 break;
2306 * Next we need to find the directory. This is easy too.
2308 codeview_dir = (struct CV4_DirHead *)
2309 (codeview + ((unsigned int*) codeview)[1]);
2312 * Some more sanity checks. Make sure that everything
2313 * is as we expect it.
2315 if( codeview_dir->next_offset != 0
2316 || codeview_dir->dhsize != sizeof(*codeview_dir)
2317 || codeview_dir->desize != sizeof(*codeview_dent) )
2319 break;
2321 codeview_dent = (struct CV4_DirEnt *) (codeview_dir + 1);
2323 for(j=0; j < codeview_dir->ndir; j++, codeview_dent++)
2325 if( codeview_dent->subsect_number == sstAlignSym )
2328 * Check the previous entry. If it is a
2329 * sstSrcModule, it contains the line number
2330 * info for this file.
2332 linetab = NULL;
2333 if( codeview_dent[1].module_number == codeview_dent[0].module_number
2334 && codeview_dent[1].subsect_number == sstSrcModule )
2336 linetab = DEBUG_SnarfLinetab(
2337 codeview + codeview_dent[1].offset,
2338 codeview_dent[1].size);
2341 if( codeview_dent[-1].module_number == codeview_dent[0].module_number
2342 && codeview_dent[-1].subsect_number == sstSrcModule )
2344 linetab = DEBUG_SnarfLinetab(
2345 codeview + codeview_dent[-1].offset,
2346 codeview_dent[-1].size);
2349 * Now process the CV stuff.
2351 DEBUG_SnarfCodeView(deefer,
2352 codeview + codeview_dent->offset,
2353 codeview_dent->size,
2354 linetab);
2358 break;
2359 default:
2360 break;
2363 leave:
2365 if( addr != (char *) 0xffffffff )
2367 munmap(addr, statbuf.st_size);
2370 if( fd != -1 )
2372 close(fd);
2375 return TRUE;
2379 DEBUG_ProcessDeferredDebug()
2381 struct deferred_debug_info * deefer;
2382 struct CodeViewDebug * cvd;
2383 struct MiscDebug * misc;
2384 char * filename;
2385 int last_proc = -1;
2386 int need_print =0;
2388 DEBUG_InitCVDataTypes();
2390 for(deefer = dbglist; deefer; deefer = deefer->next)
2392 if( deefer->loaded )
2394 continue;
2397 if( last_proc != deefer->dbg_index )
2399 if (!need_print)
2401 fprintf(stderr, "DeferredDebug for:");
2402 need_print=1;
2404 fprintf(stderr, " %s",deefer->module_name);
2405 last_proc = deefer->dbg_index;
2408 switch(deefer->dbgdir->Type)
2410 case IMAGE_DEBUG_TYPE_COFF:
2412 * Standard COFF debug information that VC++ adds when you
2413 * use /debugtype:both with the linker.
2415 #if 0
2416 fprintf(stderr, "Processing COFF symbols...\n");
2417 #endif
2418 DEBUG_ProcessCoff(deefer);
2419 break;
2420 case IMAGE_DEBUG_TYPE_CODEVIEW:
2422 * This is a pointer to a PDB file of some sort.
2424 cvd = (struct CodeViewDebug *) deefer->dbg_info;
2426 if( strcmp(cvd->cv_nbtype, "NB10") != 0 )
2429 * Whatever this is, we don't know how to deal with
2430 * it yet.
2432 break;
2434 DEBUG_ProcessPDBFile(deefer, cvd->cv_name);
2435 #if 0
2436 fprintf(stderr, "Processing PDB file %s\n", cvd->cv_name);
2437 #endif
2438 break;
2439 case IMAGE_DEBUG_TYPE_MISC:
2441 * A pointer to a .DBG file of some sort. These files
2442 * can contain either CV4 or COFF information. Open
2443 * the file, and try to do the right thing with it.
2445 misc = (struct MiscDebug *) deefer->dbg_info;
2447 filename = strrchr((char *) &misc->Data, '.');
2450 * Ignore the file if it doesn't have a .DBG extension.
2452 if( (filename == NULL)
2453 || ( (strcmp(filename, ".dbg") != 0)
2454 && (strcmp(filename, ".DBG") != 0)) )
2456 break;
2459 filename = (char *) &misc->Data;
2462 * Do the dirty deed...
2464 DEBUG_ProcessDBGFile(deefer, filename);
2466 break;
2467 default:
2469 * We should never get here...
2471 break;
2474 if(need_print)
2475 fprintf(stderr, "\n");
2476 return TRUE;
2480 /***********************************************************************
2481 * DEBUG_InfoShare
2483 * Display shared libarary information.
2485 void DEBUG_InfoShare(void)
2487 struct deferred_debug_info * deefer;
2489 fprintf(stderr,"Address\t\tModule\tName\n");
2491 for(deefer = dbglist; deefer; deefer = deefer->next)
2493 fprintf(stderr,"0x%8.8x\t(%s)\t%s\n", (unsigned int) deefer->load_addr,
2494 deefer->module ? "Win32" : "ELF", deefer->module_name);