Create directories that don't contain a Makefile.
[wine/multimedia.git] / debugger / stabs.c
blob30a7c46587f9a6784573dd7feb1678898d20affd
1 /* -*- tab-width: 8; c-basic-offset: 2 -*- */
3 /*
4 * File stabs.c - read stabs information from the wine executable itself.
6 * Copyright (C) 1996, Eric Youngdale.
7 */
9 #include "config.h"
11 #include <sys/types.h>
12 #include <fcntl.h>
13 #include <sys/stat.h>
14 #ifdef HAVE_SYS_MMAN_H
15 #include <sys/mman.h>
16 #endif
17 #include <limits.h>
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <string.h>
21 #include <unistd.h>
22 #ifndef PATH_MAX
23 #define PATH_MAX _MAX_PATH
24 #endif
26 #include "options.h"
27 #include "debugger.h"
29 #if defined(__svr4__) || defined(__sun)
30 #define __ELF__
31 #endif
33 #ifdef __ELF__
34 #ifdef HAVE_ELF_H
35 # include <elf.h>
36 #endif
37 #ifdef HAVE_LINK_H
38 # include <link.h>
39 #endif
40 #elif defined(__EMX__)
41 #ifdef HAVE_A_OUT_H
42 # include <a_out.h>
43 #endif
44 #else
45 #ifdef HAVE_A_OUT_H
46 # include <a.out.h>
47 #endif
48 #endif
50 #ifndef N_UNDF
51 #define N_UNDF 0x00
52 #endif
54 #define N_GSYM 0x20
55 #define N_FUN 0x24
56 #define N_STSYM 0x26
57 #define N_LCSYM 0x28
58 #define N_MAIN 0x2a
59 #define N_ROSYM 0x2c
60 #define N_OPT 0x3c
61 #define N_RSYM 0x40
62 #define N_SLINE 0x44
63 #define N_SO 0x64
64 #define N_LSYM 0x80
65 #define N_BINCL 0x82
66 #define N_SOL 0x84
67 #define N_PSYM 0xa0
68 #define N_EINCL 0xa2
69 #define N_LBRAC 0xc0
70 #define N_EXCL 0xc2
71 #define N_RBRAC 0xe0
74 struct stab_nlist {
75 union {
76 char *n_name;
77 struct stab_nlist *n_next;
78 long n_strx;
79 } n_un;
80 unsigned char n_type;
81 char n_other;
82 short n_desc;
83 unsigned long n_value;
87 * This is used to keep track of known datatypes so that we don't redefine
88 * them over and over again. It sucks up lots of memory otherwise.
90 struct known_typedef
92 struct known_typedef * next;
93 char * name;
94 int ndefs;
95 struct datatype * types[1];
98 #define NR_STAB_HASH 521
100 struct known_typedef * ktd_head[NR_STAB_HASH] = {NULL,};
102 static unsigned int stab_hash( const char * name )
104 unsigned int hash = 0;
105 unsigned int tmp;
106 const char * p;
108 p = name;
110 while (*p)
112 hash = (hash << 4) + *p++;
114 if( (tmp = (hash & 0xf0000000)) )
116 hash ^= tmp >> 24;
118 hash &= ~tmp;
120 return hash % NR_STAB_HASH;
124 static void stab_strcpy(char * dest, const char * source)
127 * A strcpy routine that stops when we hit the ':' character.
128 * Faster than copying the whole thing, and then nuking the
129 * ':'.
131 while(*source != '\0' && *source != ':')
132 *dest++ = *source++;
133 *dest++ = '\0';
136 typedef struct {
137 char* name;
138 unsigned long value;
139 int idx;
140 struct datatype** vector;
141 int nrofentries;
142 } include_def;
144 #define MAX_INCLUDES 256
146 static include_def* include_defs = NULL;
147 static int num_include_def = 0;
148 static int num_alloc_include_def = 0;
149 static int cu_include_stack[MAX_INCLUDES];
150 static int cu_include_stk_idx = 0;
151 static struct datatype** cu_vector = NULL;
152 static int cu_nrofentries = 0;
154 static
155 int
156 DEBUG_CreateInclude(const char* file, unsigned long val)
158 if (num_include_def == num_alloc_include_def)
160 num_alloc_include_def += 256;
161 include_defs = DBG_realloc(include_defs, sizeof(include_defs[0])*num_alloc_include_def);
162 memset(include_defs+num_include_def, 0, sizeof(include_defs[0])*256);
164 include_defs[num_include_def].name = DBG_strdup(file);
165 include_defs[num_include_def].value = val;
166 include_defs[num_include_def].vector = NULL;
167 include_defs[num_include_def].nrofentries = 0;
169 return num_include_def++;
172 static
173 int
174 DEBUG_FindInclude(const char* file, unsigned long val)
176 int i;
178 for (i = 0; i < num_include_def; i++)
180 if (val == include_defs[i].value &&
181 strcmp(file, include_defs[i].name) == 0)
182 return i;
184 return -1;
187 static
189 DEBUG_AddInclude(int idx)
191 ++cu_include_stk_idx;
193 /* is this happen, just bump MAX_INCLUDES */
194 /* we could also handle this as another dynarray */
195 assert(cu_include_stk_idx < MAX_INCLUDES);
197 cu_include_stack[cu_include_stk_idx] = idx;
198 return cu_include_stk_idx;
201 static
202 void
203 DEBUG_ResetIncludes(void)
206 * The datatypes that we would need to use are reset when
207 * we start a new file. (at least the ones in filenr == 0
209 cu_include_stk_idx = 0;/* keep 0 as index for the .c file itself */
210 memset(cu_vector, 0, sizeof(cu_vector[0]) * cu_nrofentries);
213 static
214 void
215 DEBUG_FreeIncludes(void)
217 int i;
219 DEBUG_ResetIncludes();
221 for (i = 0; i < num_include_def; i++)
223 DBG_free(include_defs[i].name);
224 DBG_free(include_defs[i].vector);
226 DBG_free(include_defs);
227 include_defs = NULL;
228 num_include_def = 0;
229 num_alloc_include_def = 0;
230 DBG_free(cu_vector);
231 cu_vector = NULL;
232 cu_nrofentries = 0;
235 #define MAX_TD_NESTING 128
237 static
238 struct datatype**
239 DEBUG_FileSubNr2StabEnum(int filenr, int subnr)
241 struct datatype** ret;
243 /* fprintf(stderr, "creating type id for (%d,%d)\n", filenr, subnr); */
245 /* FIXME: I could perhaps create a dummy include_def for each compilation
246 * unit which would allow not to handle those two cases separately
248 if (filenr == 0)
250 if (cu_nrofentries <= subnr)
252 cu_vector = DBG_realloc(cu_vector, sizeof(cu_vector[0])*(subnr+1));
253 memset(cu_vector+cu_nrofentries, 0, sizeof(cu_vector[0])*(subnr+1-cu_nrofentries));
254 cu_nrofentries = subnr + 1;
256 ret = &cu_vector[subnr];
258 else
260 include_def* idef;
262 assert(filenr <= cu_include_stk_idx);
264 idef = &include_defs[cu_include_stack[filenr]];
266 if (idef->nrofentries <= subnr)
268 idef->vector = DBG_realloc(idef->vector, sizeof(idef->vector[0])*(subnr+1));
269 memset(idef->vector + idef->nrofentries, 0, sizeof(idef->vector[0])*(subnr+1-idef->nrofentries));
270 idef->nrofentries = subnr + 1;
272 ret = &idef->vector[subnr];
274 /* fprintf(stderr,"(%d,%d) is %d\n",filenr,subnr,ret); */
275 return ret;
278 static
279 struct datatype**
280 DEBUG_ReadTypeEnumBackwards(char*x) {
281 int filenr,subnr;
283 if (*x==')') {
284 while (*x!='(')
285 x--;
286 x++; /* '(' */
287 filenr=strtol(x,&x,10); /* <int> */
288 x++; /* ',' */
289 subnr=strtol(x,&x,10); /* <int> */
290 x++; /* ')' */
291 } else {
292 while ((*x>='0') && (*x<='9'))
293 x--;
294 filenr = 0;
295 subnr = atol(x+1);
297 return DEBUG_FileSubNr2StabEnum(filenr,subnr);
300 static
301 struct datatype**
302 DEBUG_ReadTypeEnum(char **x) {
303 int filenr,subnr;
305 if (**x=='(') {
306 (*x)++; /* '(' */
307 filenr=strtol(*x,x,10); /* <int> */
308 (*x)++; /* ',' */
309 subnr=strtol(*x,x,10); /* <int> */
310 (*x)++; /* ')' */
311 } else {
312 filenr = 0;
313 subnr = strtol(*x,x,10); /* <int> */
315 return DEBUG_FileSubNr2StabEnum(filenr,subnr);
318 static
320 DEBUG_RegisterTypedef(const char * name, struct datatype ** types, int ndef)
322 int hash;
323 struct known_typedef * ktd;
325 if( ndef == 1 )
326 return TRUE;
328 ktd = (struct known_typedef *) DBG_alloc(sizeof(struct known_typedef)
329 + (ndef - 1) * sizeof(struct datatype *));
331 hash = stab_hash(name);
333 ktd->name = DBG_strdup(name);
334 ktd->ndefs = ndef;
335 memcpy(&ktd->types[0], types, ndef * sizeof(struct datatype *));
336 ktd->next = ktd_head[hash];
337 ktd_head[hash] = ktd;
339 return TRUE;
342 static
344 DEBUG_HandlePreviousTypedef(const char * name, const char * stab)
346 int count;
347 enum debug_type expect;
348 int hash;
349 struct known_typedef * ktd;
350 char * ptr;
352 hash = stab_hash(name);
354 for(ktd = ktd_head[hash]; ktd; ktd = ktd->next)
355 if ((ktd->name[0] == name[0]) && (strcmp(name, ktd->name) == 0) )
356 break;
359 * Didn't find it. This must be a new one.
361 if( ktd == NULL )
362 return FALSE;
365 * Examine the stab to make sure it has the same number of definitions.
367 count = 0;
368 for(ptr = strchr(stab, '='); ptr; ptr = strchr(ptr+1, '='))
370 if( count >= ktd->ndefs )
371 return FALSE;
374 * Make sure the types of all of the objects is consistent with
375 * what we have already parsed.
377 switch(ptr[1])
379 case '*':
380 expect = DT_POINTER;
381 break;
382 case 's':
383 case 'u':
384 expect = DT_STRUCT;
385 break;
386 case 'a':
387 expect = DT_ARRAY;
388 break;
389 case '(': /* it's mainly a ref to another typedef, skip it */
390 expect = -1;
391 break;
392 case '1':
393 case 'r':
394 expect = DT_BASIC;
395 break;
396 case 'x':
397 expect = DT_STRUCT;
398 break;
399 case 'e':
400 expect = DT_ENUM;
401 break;
402 case 'f':
403 expect = DT_FUNC;
404 break;
405 default:
406 fprintf(stderr, "Unknown type (%c).\n",ptr[1]);
407 return FALSE;
409 if( expect != -1 && expect != DEBUG_GetType(ktd->types[count]) )
410 return FALSE;
411 count++;
414 if( ktd->ndefs != count )
415 return FALSE;
418 * Go through, dig out all of the type numbers, and substitute the
419 * appropriate things.
421 count = 0;
422 for(ptr = strchr(stab, '='); ptr; ptr = strchr(ptr+1, '='))
423 *DEBUG_ReadTypeEnumBackwards(ptr-1) = ktd->types[count++];
425 return TRUE;
428 static int DEBUG_FreeRegisteredTypedefs(void)
430 int count;
431 int j;
432 struct known_typedef * ktd;
433 struct known_typedef * next;
435 count = 0;
436 for(j=0; j < NR_STAB_HASH; j++ )
438 for(ktd = ktd_head[j]; ktd; ktd = next)
440 count++;
441 next = ktd->next;
442 DBG_free(ktd->name);
443 DBG_free(ktd);
445 ktd_head[j] = NULL;
448 return TRUE;
452 static
454 DEBUG_ParseTypedefStab(char * ptr, const char * typename)
456 int arrmax;
457 int arrmin;
458 char * c;
459 struct datatype * curr_type;
460 struct datatype * datatype;
461 struct datatype * curr_types[MAX_TD_NESTING];
462 char element_name[1024];
463 int ntypes = 0, ntp;
464 int offset;
465 const char * orig_typename;
466 int size;
467 char * tc;
468 char * tc2;
469 int failure;
471 orig_typename = typename;
473 if( DEBUG_HandlePreviousTypedef(typename, ptr) )
474 return TRUE;
477 * Go from back to front. First we go through and figure out what
478 * type numbers we need, and register those types. Then we go in
479 * and fill the details.
482 for( c = strchr(ptr, '='); c != NULL; c = strchr(c + 1, '=') )
485 * Back up until we get to a non-numeric character, to get datatype
487 struct datatype** dt = DEBUG_ReadTypeEnumBackwards(c-1);
489 if( ntypes >= MAX_TD_NESTING )
492 * If this ever happens, just bump the counter.
494 fprintf(stderr, "Typedef nesting overflow\n");
495 return FALSE;
498 switch(c[1])
500 case '*':
501 *dt = DEBUG_NewDataType(DT_POINTER, NULL);
502 curr_types[ntypes++] = *dt;
503 break;
504 case 's':
505 case 'u':
506 *dt = DEBUG_NewDataType(DT_STRUCT, typename);
507 curr_types[ntypes++] = *dt;
508 break;
509 case 'a':
510 *dt = DEBUG_NewDataType(DT_ARRAY, NULL);
511 curr_types[ntypes++] = *dt;
512 break;
513 case '(':
514 /* will be handled in next loop,
515 * just a ref to another type
517 curr_types[ntypes++] = NULL;
518 break;
519 case '1':
520 case 'r':
521 *dt = DEBUG_NewDataType(DT_BASIC, typename);
522 curr_types[ntypes++] = *dt;
523 break;
524 case 'x':
525 stab_strcpy(element_name, c + 3);
526 *dt = DEBUG_NewDataType(DT_STRUCT, element_name);
527 curr_types[ntypes++] = *dt;
528 break;
529 case 'e':
530 *dt = DEBUG_NewDataType(DT_ENUM, NULL);
531 curr_types[ntypes++] = *dt;
532 break;
533 case 'f':
534 *dt = DEBUG_NewDataType(DT_FUNC, NULL);
535 curr_types[ntypes++] = *dt;
536 break;
537 default:
538 fprintf(stderr, "Unknown type (%c).\n",c[1]);
540 typename = NULL;
544 ntp = ntypes - 1;
546 * OK, now take a second sweep through. Now we will be digging
547 * out the definitions of the various components, and storing
548 * them in the skeletons that we have already allocated. We take
549 * a right-to left search as this is much easier to parse.
551 for( c = strrchr(ptr, '='); c != NULL; c = strrchr(ptr, '=') )
553 struct datatype** dt = DEBUG_ReadTypeEnumBackwards(c-1);
554 struct datatype** dt2;
556 curr_type = *dt;
558 switch(c[1])
560 case 'x':
561 ntp--;
562 tc = c + 3;
563 while( *tc != ':' )
564 tc++;
565 tc++;
566 if( *tc == '\0' )
567 *c = '\0';
568 else
569 strcpy(c, tc);
570 break;
571 case '*':
572 case 'f':
573 ntp--;
574 tc = c + 2;
575 datatype = *DEBUG_ReadTypeEnum(&tc);
576 DEBUG_SetPointerType(curr_type, datatype);
577 if( *tc == '\0' )
578 *c = '\0';
579 else
580 strcpy(c, tc);
581 break;
582 case '(':
583 tc = c + 1;
584 dt2 = DEBUG_ReadTypeEnum(&tc);
586 if (!*dt && *dt2)
588 *dt = *dt2;
590 else if (!*dt && !*dt2)
592 /* this should be a basic type, define it */
593 *dt2 = *dt = DEBUG_NewDataType(DT_BASIC, typename);
595 else
597 fprintf(stderr, "Unknown condition %p %p (%s)\n", *dt, *dt2, ptr);
599 if( *tc == '\0' )
600 *c = '\0';
601 else
602 strcpy(c, tc);
603 curr_types[ntp--] = *dt;
604 break;
605 case '1':
606 case 'r':
607 ntp--;
609 * We have already handled these above.
611 *c = '\0';
612 break;
613 case 'a':
614 ntp--;
615 /* ar<typeinfo_nodef>;<int>;<int>;<typeinfo>,<int>,<int>;; */
617 tc = c + 3;
618 /* 'r' */
619 DEBUG_ReadTypeEnum(&tc);
620 tc++; /* ';' */
621 arrmin = strtol(tc, &tc, 10); /* <int> */
622 tc++; /* ';' */
623 arrmax = strtol(tc, &tc, 10); /* <int> */
624 tc++; /* ';' */
625 datatype = *DEBUG_ReadTypeEnum(&tc); /* <typeinfo> */
626 if( *tc == '\0' )
627 *c = '\0';
628 else
629 strcpy(c, tc);
630 DEBUG_SetArrayParams(curr_type, arrmin, arrmax, datatype);
631 break;
632 case 's':
633 case 'u':
634 ntp--;
635 failure = 0;
637 tc = c + 2;
638 if( DEBUG_SetStructSize(curr_type, strtol(tc, &tc, 10)) == FALSE )
641 * We have already filled out this structure. Nothing to do,
642 * so just skip forward to the end of the definition.
644 while( tc[0] != ';' && tc[1] != ';' )
645 tc++;
647 tc += 2;
649 if( *tc == '\0' )
650 *c = '\0';
651 else
652 strcpy(c, tc + 1);
653 continue;
657 * Now parse the individual elements of the structure/union.
659 while(*tc != ';')
661 char *ti;
662 tc2 = element_name;
663 while(*tc != ':')
664 *tc2++ = *tc++;
665 tc++;
666 *tc2++ = '\0';
667 ti=tc;
668 datatype = *DEBUG_ReadTypeEnum(&tc);
669 *tc='\0';
670 tc++;
671 offset = strtol(tc, &tc, 10);
672 tc++;
673 size = strtol(tc, &tc, 10);
674 tc++;
675 if (datatype)
676 DEBUG_AddStructElement(curr_type, element_name, datatype,
677 offset, size);
678 else
680 failure = 1;
681 /* ... but proceed parsing to the end of the stab */
682 fprintf(stderr, "failure on %s %s\n", ptr, ti);
686 if (failure)
689 /* if we had a undeclared value this one is undeclared too.
690 * remove it from the stab_types.
691 * I just set it to NULL to detect bugs in my thoughtprocess.
692 * FIXME: leaks the memory for the structure elements.
693 * FIXME: such structures should have been optimized away
694 * by ld.
696 *dt = NULL;
698 if( *tc == '\0' )
699 *c = '\0';
700 else
701 strcpy(c, tc + 1);
702 break;
703 case 'e':
704 ntp--;
705 tc = c + 2;
707 * Now parse the individual elements of the structure/union.
709 while(*tc != ';')
711 tc2 = element_name;
712 while(*tc != ':')
713 *tc2++ = *tc++;
714 tc++;
715 *tc2++ = '\0';
716 offset = strtol(tc, &tc, 10);
717 tc++;
718 DEBUG_AddStructElement(curr_type, element_name, NULL, offset, 0);
720 if( *tc == '\0' )
721 *c = '\0';
722 else
723 strcpy(c, tc + 1);
724 break;
725 default:
726 fprintf(stderr, "Unknown type (%c).\n",c[1]);
727 break;
731 * Now register the type so that if we encounter it again, we will know
732 * what to do.
734 DEBUG_RegisterTypedef(orig_typename, curr_types, ntypes);
736 return TRUE;
739 static struct datatype *
740 DEBUG_ParseStabType(const char * stab)
742 char * c;
745 * Look through the stab definition, and figure out what datatype
746 * this represents. If we have something we know about, assign the
747 * type.
749 c = strchr(stab, ':');
750 if( c == NULL )
751 return NULL;
753 c++;
755 * The next character says more about the type (i.e. data, function, etc)
756 * of symbol. Skip it.
758 if (*c != '(')
759 c++;
761 * The next is either an integer or a (integer,integer).
762 * The DEBUG_ReadTypeEnum takes care that stab_types is large enough.
764 return *DEBUG_ReadTypeEnum(&c);
768 DEBUG_ParseStabs(char * addr, unsigned int load_offset,
769 unsigned int staboff, int stablen,
770 unsigned int strtaboff, int strtablen)
772 struct name_hash * curr_func = NULL;
773 struct wine_locals * curr_loc = NULL;
774 struct name_hash * curr_sym = NULL;
775 char currpath[PATH_MAX];
776 int i;
777 int in_external_file = FALSE;
778 int last_nso = -1;
779 int len;
780 DBG_VALUE new_value;
781 int nstab;
782 char * ptr;
783 char * stabbuff;
784 int stabbufflen;
785 struct stab_nlist * stab_ptr;
786 char * strs;
787 int strtabinc;
788 char * subpath = NULL;
789 char symname[4096];
791 nstab = stablen / sizeof(struct stab_nlist);
792 stab_ptr = (struct stab_nlist *) (addr + staboff);
793 strs = (char *) (addr + strtaboff);
795 memset(currpath, 0, sizeof(currpath));
798 * Allocate a buffer into which we can build stab strings for cases
799 * where the stab is continued over multiple lines.
801 stabbufflen = 65536;
802 stabbuff = (char *) DBG_alloc(stabbufflen);
804 strtabinc = 0;
805 stabbuff[0] = '\0';
806 for(i=0; i < nstab; i++, stab_ptr++ )
808 ptr = strs + (unsigned int) stab_ptr->n_un.n_name;
809 if( ptr[strlen(ptr) - 1] == '\\' )
812 * Indicates continuation. Append this to the buffer, and go onto the
813 * next record. Repeat the process until we find a stab without the
814 * '/' character, as this indicates we have the whole thing.
816 len = strlen(ptr);
817 if( strlen(stabbuff) + len > stabbufflen )
819 stabbufflen += 65536;
820 stabbuff = (char *) DBG_realloc(stabbuff, stabbufflen);
822 strncat(stabbuff, ptr, len - 1);
823 continue;
825 else if( stabbuff[0] != '\0' )
827 strcat( stabbuff, ptr);
828 ptr = stabbuff;
831 if( strchr(ptr, '=') != NULL )
834 * The stabs aren't in writable memory, so copy it over so we are
835 * sure we can scribble on it.
837 if( ptr != stabbuff )
839 strcpy(stabbuff, ptr);
840 ptr = stabbuff;
842 stab_strcpy(symname, ptr);
843 DEBUG_ParseTypedefStab(ptr, symname);
846 switch(stab_ptr->n_type)
848 case N_GSYM:
850 * These are useless with ELF. They have no value, and you have to
851 * read the normal symbol table to get the address. Thus we
852 * ignore them, and when we process the normal symbol table
853 * we should do the right thing.
855 * With a.out, they actually do make some amount of sense.
857 new_value.addr.seg = 0;
858 new_value.type = DEBUG_ParseStabType(ptr);
859 new_value.addr.off = load_offset + stab_ptr->n_value;
860 new_value.cookie = DV_TARGET;
862 stab_strcpy(symname, ptr);
863 #ifdef __ELF__
864 curr_sym = DEBUG_AddSymbol( symname, &new_value, currpath,
865 SYM_WINE | SYM_DATA | SYM_INVALID);
866 #else
867 curr_sym = DEBUG_AddSymbol( symname, &new_value, currpath,
868 SYM_WINE | SYM_DATA );
869 #endif
870 break;
871 case N_RBRAC:
872 case N_LBRAC:
874 * We need to keep track of these so we get symbol scoping
875 * right for local variables. For now, we just ignore them.
876 * The hooks are already there for dealing with this however,
877 * so all we need to do is to keep count of the nesting level,
878 * and find the RBRAC for each matching LBRAC.
880 break;
881 case N_LCSYM:
882 case N_STSYM:
884 * These are static symbols and BSS symbols.
886 new_value.addr.seg = 0;
887 new_value.type = DEBUG_ParseStabType(ptr);
888 new_value.addr.off = load_offset + stab_ptr->n_value;
889 new_value.cookie = DV_TARGET;
891 stab_strcpy(symname, ptr);
892 curr_sym = DEBUG_AddSymbol( symname, &new_value, currpath,
893 SYM_WINE | SYM_DATA );
894 break;
895 case N_PSYM:
897 * These are function parameters.
899 if( curr_func != NULL && !in_external_file )
901 stab_strcpy(symname, ptr);
902 curr_loc = DEBUG_AddLocal( curr_func, 0,
903 stab_ptr->n_value, 0, 0, symname );
904 DEBUG_SetLocalSymbolType( curr_loc, DEBUG_ParseStabType(ptr) );
906 break;
907 case N_RSYM:
908 if( curr_func != NULL && !in_external_file )
910 stab_strcpy(symname, ptr);
911 curr_loc = DEBUG_AddLocal( curr_func, stab_ptr->n_value + 1,
912 0, 0, 0, symname );
913 DEBUG_SetLocalSymbolType( curr_loc, DEBUG_ParseStabType(ptr) );
915 break;
916 case N_LSYM:
917 if( curr_func != NULL && !in_external_file )
919 stab_strcpy(symname, ptr);
920 curr_loc = DEBUG_AddLocal( curr_func, 0,
921 stab_ptr->n_value, 0, 0, symname );
922 DEBUG_SetLocalSymbolType( curr_loc, DEBUG_ParseStabType(ptr) );
924 break;
925 case N_SLINE:
927 * This is a line number. These are always relative to the start
928 * of the function (N_FUN), and this makes the lookup easier.
930 if( curr_func != NULL && !in_external_file )
932 #ifdef __ELF__
933 DEBUG_AddLineNumber(curr_func, stab_ptr->n_desc,
934 stab_ptr->n_value);
935 #else
936 #if 0
938 * This isn't right. The order of the stabs is different under
939 * a.out, and as a result we would end up attaching the line
940 * number to the wrong function.
942 DEBUG_AddLineNumber(curr_func, stab_ptr->n_desc,
943 stab_ptr->n_value - curr_func->addr.off);
944 #endif
945 #endif
947 break;
948 case N_FUN:
950 * First, clean up the previous function we were working on.
952 DEBUG_Normalize(curr_func);
955 * For now, just declare the various functions. Later
956 * on, we will add the line number information and the
957 * local symbols.
959 if( !in_external_file )
961 new_value.addr.seg = 0;
962 new_value.type = DEBUG_ParseStabType(ptr);
963 new_value.addr.off = load_offset + stab_ptr->n_value;
964 new_value.cookie = DV_TARGET;
966 * Copy the string to a temp buffer so we
967 * can kill everything after the ':'. We do
968 * it this way because otherwise we end up dirtying
969 * all of the pages related to the stabs, and that
970 * sucks up swap space like crazy.
972 stab_strcpy(symname, ptr);
973 curr_func = DEBUG_AddSymbol( symname, &new_value, currpath,
974 SYM_WINE | SYM_FUNC);
976 else
979 * Don't add line number information for this function
980 * any more.
982 curr_func = NULL;
984 break;
985 case N_SO:
987 * This indicates a new source file. Append the records
988 * together, to build the correct path name.
990 #ifndef __ELF__
992 * With a.out, there is no NULL string N_SO entry at the end of
993 * the file. Thus when we find non-consecutive entries,
994 * we consider that a new file is started.
996 if( last_nso < i-1 )
998 currpath[0] = '\0';
999 DEBUG_Normalize(curr_func);
1000 curr_func = NULL;
1002 #endif
1004 if( *ptr == '\0' )
1007 * Nuke old path.
1009 currpath[0] = '\0';
1010 DEBUG_Normalize(curr_func);
1011 curr_func = NULL;
1013 else
1015 if (*ptr != '/')
1016 strcat(currpath, ptr);
1017 else
1018 strcpy(currpath, ptr);
1019 subpath = ptr;
1020 DEBUG_ResetIncludes();
1022 last_nso = i;
1023 break;
1024 case N_SOL:
1026 * This indicates we are including stuff from an include file.
1027 * If this is the main source, enable the debug stuff, otherwise
1028 * ignore it.
1030 in_external_file = !(subpath == NULL || strcmp(ptr, subpath) == 0);
1031 break;
1032 case N_UNDF:
1033 strs += strtabinc;
1034 strtabinc = stab_ptr->n_value;
1035 DEBUG_Normalize(curr_func);
1036 curr_func = NULL;
1037 break;
1038 case N_OPT:
1040 * Ignore this. We don't care what it points to.
1042 break;
1043 case N_BINCL:
1044 DEBUG_AddInclude(DEBUG_CreateInclude(ptr, stab_ptr->n_value));
1045 break;
1046 case N_EINCL:
1047 break;
1048 case N_EXCL:
1049 DEBUG_AddInclude(DEBUG_FindInclude(ptr, stab_ptr->n_value));
1050 break;
1051 case N_MAIN:
1053 * Always ignore these. GCC doesn't even generate them.
1055 break;
1056 default:
1057 fprintf(stderr, "Unkown stab type 0x%02x\n", stab_ptr->n_type);
1058 break;
1061 stabbuff[0] = '\0';
1063 #if 0
1064 fprintf(stderr, "%d %x %s\n", stab_ptr->n_type,
1065 (unsigned int) stab_ptr->n_value,
1066 strs + (unsigned int) stab_ptr->n_un.n_name);
1067 #endif
1070 DEBUG_FreeRegisteredTypedefs();
1071 DEBUG_FreeIncludes();
1073 return TRUE;
1076 #ifdef __ELF__
1079 * Walk through the entire symbol table and add any symbols we find there.
1080 * This can be used in cases where we have stripped ELF shared libraries,
1081 * or it can be used in cases where we have data symbols for which the address
1082 * isn't encoded in the stabs.
1084 * This is all really quite easy, since we don't have to worry about line
1085 * numbers or local data variables.
1087 static
1089 DEBUG_ProcessElfSymtab(char * addr, unsigned int load_offset,
1090 Elf32_Shdr * symtab, Elf32_Shdr * strtab)
1092 char * curfile = NULL;
1093 struct name_hash * curr_sym = NULL;
1094 int flags;
1095 int i;
1096 DBG_VALUE new_value;
1097 int nsym;
1098 char * strp;
1099 char * symname;
1100 Elf32_Sym * symp;
1103 symp = (Elf32_Sym *) (addr + symtab->sh_offset);
1104 nsym = symtab->sh_size / sizeof(*symp);
1105 strp = (char *) (addr + strtab->sh_offset);
1107 for(i=0; i < nsym; i++, symp++)
1110 * Ignore certain types of entries which really aren't of that much
1111 * interest.
1113 if( ELF32_ST_TYPE(symp->st_info) == STT_SECTION )
1115 continue;
1118 symname = strp + symp->st_name;
1121 * Save the name of the current file, so we have a way of tracking
1122 * static functions/data.
1124 if( ELF32_ST_TYPE(symp->st_info) == STT_FILE )
1126 curfile = symname;
1127 continue;
1131 * See if we already have something for this symbol.
1132 * If so, ignore this entry, because it would have come from the
1133 * stabs or from a previous symbol. If the value is different,
1134 * we will have to keep the darned thing, because there can be
1135 * multiple local symbols by the same name.
1137 if( (DEBUG_GetSymbolValue(symname, -1, &new_value, FALSE ) == TRUE)
1138 && (new_value.addr.off == (load_offset + symp->st_value)) )
1139 continue;
1141 new_value.addr.seg = 0;
1142 new_value.type = NULL;
1143 new_value.addr.off = load_offset + symp->st_value;
1144 new_value.cookie = DV_TARGET;
1145 flags = SYM_WINE | (ELF32_ST_BIND(symp->st_info) == STT_FUNC
1146 ? SYM_FUNC : SYM_DATA);
1147 if( ELF32_ST_BIND(symp->st_info) == STB_GLOBAL )
1148 curr_sym = DEBUG_AddSymbol( symname, &new_value, NULL, flags );
1149 else
1150 curr_sym = DEBUG_AddSymbol( symname, &new_value, curfile, flags );
1153 * Record the size of the symbol. This can come in handy in
1154 * some cases. Not really used yet, however.
1156 if( symp->st_size != 0 )
1157 DEBUG_SetSymbolSize(curr_sym, symp->st_size);
1160 return TRUE;
1163 static
1165 DEBUG_ProcessElfObject(const char * filename, unsigned int load_offset)
1167 int rtn = FALSE;
1168 struct stat statbuf;
1169 int fd = -1;
1170 int status;
1171 char * addr = (char *) 0xffffffff;
1172 Elf32_Ehdr * ehptr;
1173 Elf32_Shdr * spnt;
1174 char * shstrtab;
1175 int nsect;
1176 int i;
1177 int stabsect;
1178 int stabstrsect;
1182 * Make sure we can stat and open this file.
1184 if( filename == NULL )
1185 goto leave;
1187 status = stat(filename, &statbuf);
1188 if( status == -1 )
1190 char *s,*t,*fn,*paths;
1191 if (strchr(filename,'/'))
1192 goto leave;
1193 paths = DBG_strdup(getenv("PATH"));
1194 s = paths;
1195 while (s && *s) {
1196 t = strchr(s,':');
1197 if (t) *t='\0';
1198 fn = (char*)DBG_alloc(strlen(filename)+1+strlen(s)+1);
1199 strcpy(fn,s);
1200 strcat(fn,"/");
1201 strcat(fn,filename);
1202 if ((rtn = DEBUG_ProcessElfObject(fn,load_offset))) {
1203 DBG_free(fn);
1204 DBG_free(paths);
1205 goto leave;
1207 DBG_free(fn);
1208 if (t) s = t+1; else break;
1210 if (!s || !*s) fprintf(stderr," not found");
1211 DBG_free(paths);
1212 goto leave;
1216 * Now open the file, so that we can mmap() it.
1218 fd = open(filename, O_RDONLY);
1219 if( fd == -1 )
1220 goto leave;
1224 * Now mmap() the file.
1226 addr = mmap(0, statbuf.st_size, PROT_READ,
1227 MAP_PRIVATE, fd, 0);
1228 if( addr == (char *) 0xffffffff )
1229 goto leave;
1232 * Next, we need to find a few of the internal ELF headers within
1233 * this thing. We need the main executable header, and the section
1234 * table.
1236 ehptr = (Elf32_Ehdr *) addr;
1238 if( load_offset == 0 )
1239 DEBUG_RegisterELFModule(ehptr->e_entry, filename);
1240 else
1241 DEBUG_RegisterELFModule(load_offset, filename);
1243 spnt = (Elf32_Shdr *) (addr + ehptr->e_shoff);
1244 nsect = ehptr->e_shnum;
1245 shstrtab = (addr + spnt[ehptr->e_shstrndx].sh_offset);
1247 stabsect = stabstrsect = -1;
1249 for(i=0; i < nsect; i++)
1251 if( strcmp(shstrtab + spnt[i].sh_name, ".stab") == 0 )
1252 stabsect = i;
1254 if( strcmp(shstrtab + spnt[i].sh_name, ".stabstr") == 0 )
1255 stabstrsect = i;
1258 if( stabsect == -1 || stabstrsect == -1 )
1259 goto leave;
1262 * OK, now just parse all of the stabs.
1264 rtn = DEBUG_ParseStabs(addr, load_offset,
1265 spnt[stabsect].sh_offset,
1266 spnt[stabsect].sh_size,
1267 spnt[stabstrsect].sh_offset,
1268 spnt[stabstrsect].sh_size);
1270 if( rtn != TRUE )
1271 goto leave;
1273 for(i=0; i < nsect; i++)
1275 if( (strcmp(shstrtab + spnt[i].sh_name, ".symtab") == 0)
1276 && (spnt[i].sh_type == SHT_SYMTAB) )
1277 DEBUG_ProcessElfSymtab(addr, load_offset,
1278 spnt + i, spnt + spnt[i].sh_link);
1280 if( (strcmp(shstrtab + spnt[i].sh_name, ".dynsym") == 0)
1281 && (spnt[i].sh_type == SHT_DYNSYM) )
1282 DEBUG_ProcessElfSymtab(addr, load_offset,
1283 spnt + i, spnt + spnt[i].sh_link);
1286 leave:
1288 if( addr != (char *) 0xffffffff )
1289 munmap(addr, statbuf.st_size);
1291 if( fd != -1 )
1292 close(fd);
1294 return (rtn);
1299 DEBUG_ReadExecutableDbgInfo(void)
1301 const char * exe_name;
1302 DBG_VALUE val;
1303 u_long dyn_addr;
1304 Elf32_Dyn dyn;
1305 struct r_debug dbg_hdr;
1306 u_long lm_addr;
1307 struct link_map lm;
1308 Elf32_Ehdr ehdr;
1309 char bufstr[256];
1310 int rtn = FALSE;
1311 int rowcount;
1313 exe_name = argv0;
1316 * Make sure we can stat and open this file.
1318 if( exe_name == NULL )
1319 goto leave;
1321 fprintf( stderr, "Loading symbols: %s", exe_name );
1322 rowcount = 17 + strlen(exe_name);
1323 DEBUG_ProcessElfObject(exe_name, 0);
1325 if (!DEBUG_GetSymbolValue("_DYNAMIC", -1, &val, FALSE)) {
1326 fprintf(stderr, "Can't find symbol _DYNAMIC\n");
1327 goto leave;
1329 dyn_addr = val.addr.off;
1331 do {
1332 if (!DEBUG_READ_MEM_VERBOSE((void*)dyn_addr, &dyn, sizeof(dyn)))
1333 goto leave;
1334 dyn_addr += sizeof(dyn);
1335 } while (dyn.d_tag != DT_DEBUG && dyn.d_tag != DT_NULL);
1336 if (dyn.d_tag == DT_NULL) goto leave;
1339 * OK, now dig into the actual tables themselves.
1341 if (!DEBUG_READ_MEM_VERBOSE((void*)dyn.d_un.d_ptr, &dbg_hdr, sizeof(dbg_hdr)))
1342 goto leave;
1345 * Now walk the linked list. In all known ELF implementations,
1346 * the dynamic loader maintains this linked list for us. In some
1347 * cases the first entry doesn't appear with a name, in other cases it
1348 * does.
1350 for (lm_addr = (u_long)dbg_hdr.r_map; lm_addr; lm_addr = (u_long)lm.l_next)
1352 if (!DEBUG_READ_MEM_VERBOSE((void*)lm_addr, &lm, sizeof(lm)))
1353 goto leave;
1354 if (!DEBUG_READ_MEM_VERBOSE((void*)lm.l_addr, &ehdr, sizeof(ehdr)))
1355 continue;
1357 * We already got the stuff for the executable using the
1358 * argv[0] entry above. Here we only need to concentrate on any
1359 * shared libraries which may be loaded.
1361 if( (lm.l_addr == 0) || (ehdr.e_type != ET_DYN) )
1362 continue;
1364 if( lm.l_name != NULL )
1366 if (!DEBUG_READ_MEM_VERBOSE(lm.l_name, bufstr, sizeof(bufstr)))
1367 continue;
1368 bufstr[sizeof(bufstr) - 1] = '\0';
1369 if (rowcount + strlen(bufstr) > 76)
1371 fprintf( stderr, "\n " );
1372 rowcount = 3;
1374 fprintf( stderr, " %s", bufstr );
1375 rowcount += strlen(bufstr) + 1;
1376 DEBUG_ProcessElfObject(bufstr, lm.l_addr);
1380 rtn = TRUE;
1382 leave:
1383 fprintf( stderr, "\n" );
1384 return (rtn);
1388 #else /* !__ELF__ */
1390 #ifdef linux
1392 * a.out linux.
1395 DEBUG_ReadExecutableDbgInfo(void)
1397 char * addr = (char *) 0xffffffff;
1398 char * exe_name;
1399 struct exec * ahdr;
1400 int fd = -1;
1401 int rtn = FALSE;
1402 unsigned int staboff;
1403 struct stat statbuf;
1404 int status;
1405 unsigned int stroff;
1407 exe_name = argv0;
1410 * Make sure we can stat and open this file.
1412 if( exe_name == NULL )
1413 goto leave;
1415 status = stat(exe_name, &statbuf);
1416 if( status == -1 )
1417 goto leave;
1420 * Now open the file, so that we can mmap() it.
1422 fd = open(exe_name, O_RDONLY);
1423 if( fd == -1 )
1424 goto leave;
1428 * Now mmap() the file.
1430 addr = mmap(0, statbuf.st_size, PROT_READ,
1431 MAP_PRIVATE, fd, 0);
1432 if( addr == (char *) 0xffffffff )
1433 goto leave;
1435 ahdr = (struct exec *) addr;
1437 staboff = N_SYMOFF(*ahdr);
1438 stroff = N_STROFF(*ahdr);
1439 rtn = DEBUG_ParseStabs(addr, 0,
1440 staboff,
1441 ahdr->a_syms,
1442 stroff,
1443 statbuf.st_size - stroff);
1446 * Give a nice status message here...
1448 fprintf( stderr, "Loading symbols: %s", exe_name );
1450 rtn = TRUE;
1452 leave:
1454 if( addr != (char *) 0xffffffff )
1455 munmap(addr, statbuf.st_size);
1457 if( fd != -1 )
1458 close(fd);
1460 return (rtn);
1463 #else
1465 * Non-linux, non-ELF platforms.
1468 DEBUG_ReadExecutableDbgInfo(void)
1470 return FALSE;
1472 #endif
1474 #endif /* __ELF__ */