- New implementation of SendMessage, ReceiveMessage, ReplyMessage functions
[wine] / debugger / stabs.c
1 /*
2  * File stabs.c - read stabs information from the wine executable itself.
3  *
4  * Copyright (C) 1996, Eric Youngdale.
5  */
6
7 #include "config.h"
8
9 #include <sys/types.h>
10 #include <fcntl.h>
11 #include <sys/stat.h>
12 #include <sys/mman.h>
13 #include <limits.h>
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <string.h>
17 #include <unistd.h>
18 #ifndef PATH_MAX
19 #define PATH_MAX _MAX_PATH
20 #endif
21
22 #include "win.h"
23 #include "debugger.h"
24 #include "xmalloc.h"
25
26 #ifdef __svr4__
27 #define __ELF__
28 #endif
29
30 #ifdef __ELF__
31 #ifdef HAVE_ELF_H
32 # include <elf.h>
33 #endif
34 #include <link.h>
35 #include <sys/mman.h>
36 #elif defined(__EMX__)
37 #include <a_out.h>
38 #else
39 #include <a.out.h>
40 #endif
41
42 #ifndef N_UNDF
43 #define N_UNDF          0x00
44 #endif
45
46 #define N_GSYM          0x20
47 #define N_FUN           0x24
48 #define N_STSYM         0x26
49 #define N_LCSYM         0x28
50 #define N_MAIN          0x2a
51 #define N_ROSYM         0x2c
52 #define N_OPT           0x3c
53 #define N_RSYM          0x40
54 #define N_SLINE         0x44
55 #define N_SO            0x64
56 #define N_LSYM          0x80
57 #define N_BINCL         0x82
58 #define N_SOL           0x84
59 #define N_PSYM          0xa0
60 #define N_EINCL         0xa2
61 #define N_LBRAC         0xc0
62 #define N_RBRAC         0xe0
63
64
65 /*
66  * This is how we translate stab types into our internal representations
67  * of datatypes.
68  */
69 static struct datatype ** stab_types = NULL;
70 static int num_stab_types = 0;
71
72 /*
73  * Set so that we know the main executable name and path.
74  */
75 char * DEBUG_argv0;
76
77 struct stab_nlist {
78   union {
79     char *n_name;
80     struct stab_nlist *n_next;
81     long n_strx;
82   } n_un;
83   unsigned char n_type;
84   char n_other;
85   short n_desc;
86   unsigned long n_value;
87 };
88
89 /*
90  * This is used to keep track of known datatypes so that we don't redefine
91  * them over and over again.  It sucks up lots of memory otherwise.
92  */
93 struct known_typedef
94 {
95   struct known_typedef * next;
96   char                 * name;
97   int                    ndefs;
98   struct datatype      * types[0];
99 };
100
101 #define NR_STAB_HASH 521
102
103 struct known_typedef * ktd_head[NR_STAB_HASH] = {NULL,};
104
105 static unsigned int stab_hash( const char * name )
106 {
107     unsigned int hash = 0;
108     unsigned int tmp;
109     const char * p;
110
111     p = name;
112
113     while (*p) 
114       {
115         hash = (hash << 4) + *p++;
116
117         if( (tmp = (hash & 0xf0000000)) )
118           {
119             hash ^= tmp >> 24;
120           }
121         hash &= ~tmp;
122       }
123     return hash % NR_STAB_HASH;
124 }
125
126
127 static void stab_strcpy(char * dest, const char * source)
128 {
129   /*
130    * A strcpy routine that stops when we hit the ':' character.
131    * Faster than copying the whole thing, and then nuking the
132    * ':'.
133    */
134   while(*source != '\0' && *source != ':')
135       *dest++ = *source++;
136   *dest++ = '\0';
137 }
138
139 #define MAX_TD_NESTING  128
140
141 static int **typenums;
142 static int *nroftypenums=NULL;
143 static int nrofnroftypenums=0;
144 static int curtypenum = 0;
145
146 static
147 int
148 DEBUG_FileSubNr2StabEnum(int filenr,int subnr) {
149     if (nrofnroftypenums<=filenr) {
150         nroftypenums = xrealloc(nroftypenums,sizeof(nroftypenums[0])*(filenr+1));
151         memset(nroftypenums+nrofnroftypenums,0,(filenr+1-nrofnroftypenums)*sizeof(nroftypenums[0]));
152         typenums = xrealloc(typenums,sizeof(typenums[0])*(filenr+1));
153         memset(typenums+nrofnroftypenums,0,sizeof(typenums[0])*(filenr+1-nrofnroftypenums));
154         nrofnroftypenums=filenr+1;
155     }
156     if (nroftypenums[filenr]<=subnr) {
157         typenums[filenr] = xrealloc(typenums[filenr],sizeof(typenums[0][0])*(subnr+1));
158         memset(typenums[filenr]+nroftypenums[filenr],0,sizeof(typenums[0][0])*(subnr+1-nroftypenums[filenr]));
159         nroftypenums[filenr] = subnr+1;
160     }
161     if (!typenums[filenr][subnr])
162         typenums[filenr][subnr]=++curtypenum;
163
164     if( num_stab_types <= curtypenum ) {
165         num_stab_types = curtypenum + 256;
166         stab_types = (struct datatype **) xrealloc(stab_types, 
167                     num_stab_types * sizeof(struct datatype *)
168         );
169         memset( stab_types + curtypenum, 0, sizeof(struct datatype *) * (num_stab_types - curtypenum) );
170     }
171     /*fprintf(stderr,"(%d,%d) is %d\n",filenr,subnr,typenums[filenr][subnr]); */
172     return typenums[filenr][subnr];
173 }
174
175 static
176 int
177 DEBUG_ReadTypeEnumBackwards(char*x) {
178     int filenr,subnr;
179
180     if (*x==')') {
181         while (*x!='(')
182             x--;
183         x++;                            /* '(' */
184         filenr=strtol(x,&x,10);         /* <int> */
185         x++;                            /* ',' */
186         subnr=strtol(x,&x,10);          /* <int> */
187         x++;                            /* ')' */
188     } else {
189         while ((*x>='0') && (*x<='9'))
190             x--;
191         filenr = 0;
192         subnr = atol(x+1);
193     }
194     return DEBUG_FileSubNr2StabEnum(filenr,subnr);
195 }
196
197 static 
198 int
199 DEBUG_ReadTypeEnum(char **x) {
200     int filenr,subnr;
201
202     if (**x=='(') {
203         (*x)++;                                 /* '(' */
204         filenr=strtol(*x,x,10);                 /* <int> */
205         (*x)++;                                 /* ',' */
206         subnr=strtol(*x,x,10);                  /* <int> */
207         (*x)++;                                 /* ')' */
208     } else {
209         filenr = 0;
210         subnr = strtol(*x,x,10);                /* <int> */
211     }
212     return DEBUG_FileSubNr2StabEnum(filenr,subnr);
213 }
214
215 static
216 int
217 DEBUG_RegisterTypedef(const char * name, struct datatype ** types, int ndef)
218 {
219   int                    hash;
220   struct known_typedef * ktd;
221
222   if( ndef == 1 )
223       return TRUE;
224
225   ktd = (struct known_typedef *) xmalloc(sizeof(struct known_typedef) 
226                                          + ndef * sizeof(struct datatype *));
227   
228   hash = stab_hash(name);
229
230   ktd->name = xstrdup(name);
231   ktd->ndefs = ndef;
232   memcpy(&ktd->types[0], types, ndef * sizeof(struct datatype *));
233   ktd->next = ktd_head[hash];
234   ktd_head[hash] = ktd;
235
236   return TRUE;
237 }
238
239 static
240 int
241 DEBUG_HandlePreviousTypedef(const char * name, const char * stab)
242 {
243   int                    count;
244   enum debug_type        expect;
245   int                    hash;
246   struct known_typedef * ktd;
247   char                 * ptr;
248
249   hash = stab_hash(name);
250
251   for(ktd = ktd_head[hash]; ktd; ktd = ktd->next)
252       if ((ktd->name[0] == name[0]) && (strcmp(name, ktd->name) == 0) )
253           break;
254
255   /*
256    * Didn't find it.  This must be a new one.
257    */
258   if( ktd == NULL )
259       return FALSE;
260
261   /*
262    * Examine the stab to make sure it has the same number of definitions.
263    */
264   count = 0;
265   for(ptr = strchr(stab, '='); ptr; ptr = strchr(ptr+1, '='))
266     {
267       if( count >= ktd->ndefs )
268           return FALSE;
269
270       /*
271        * Make sure the types of all of the objects is consistent with
272        * what we have already parsed.
273        */
274       switch(ptr[1])
275         {
276         case '*':
277           expect = DT_POINTER;
278           break;
279         case 's':
280         case 'u':
281           expect = DT_STRUCT;
282           break;
283         case 'a':
284           expect = DT_ARRAY;
285           break;
286         case '1':
287         case '(':
288         case 'r':
289           expect = DT_BASIC;
290           break;
291         case 'x':
292           expect = DT_STRUCT;
293           break;
294         case 'e':
295           expect = DT_ENUM;
296           break;
297         case 'f':
298           expect = DT_FUNC;
299           break;
300         default:
301           fprintf(stderr, "Unknown type (%c).\n",ptr[1]);
302           return FALSE;
303         }
304       if( expect != DEBUG_GetType(ktd->types[count]) )
305           return FALSE;
306       count++;
307     }
308
309   if( ktd->ndefs != count )
310       return FALSE;
311
312   /*
313    * Go through, dig out all of the type numbers, and substitute the
314    * appropriate things.
315    */
316   count = 0;
317   for(ptr = strchr(stab, '='); ptr; ptr = strchr(ptr+1, '='))
318       stab_types[DEBUG_ReadTypeEnumBackwards(ptr-1)] = ktd->types[count++];
319
320   return TRUE;
321 }
322
323 static int DEBUG_FreeRegisteredTypedefs()
324 {
325   int                    count;
326   int                    j;
327   struct known_typedef * ktd;
328   struct known_typedef * next;
329
330   count = 0;
331   for(j=0; j < NR_STAB_HASH; j++ )
332     {
333       for(ktd = ktd_head[j]; ktd; ktd = next)
334         {
335           count++;
336           next = ktd->next;
337           free(ktd->name);
338           free(ktd);
339         }  
340       ktd_head[j] = NULL;
341     }
342
343   return TRUE;
344
345 }
346
347 static 
348 int
349 DEBUG_ParseTypedefStab(char * ptr, const char * typename)
350 {
351   int               arrmax;
352   int               arrmin;
353   char            * c;
354   struct datatype * curr_type;
355   struct datatype * datatype;
356   struct datatype * curr_types[MAX_TD_NESTING];
357   char              element_name[1024];
358   int               ntypes = 0;
359   int               offset;
360   const char      * orig_typename;
361   int               size;
362   char            * tc;
363   char            * tc2;
364   int               typenum;
365
366   orig_typename = typename;
367
368   if( DEBUG_HandlePreviousTypedef(typename, ptr) )
369       return TRUE;
370
371   /* 
372    * Go from back to front.  First we go through and figure out what
373    * type numbers we need, and register those types.  Then we go in
374    * and fill the details.  
375    */
376
377   for( c = strchr(ptr, '='); c != NULL; c = strchr(c + 1, '=') )
378     {
379       /*
380        * Back up until we get to a non-numeric character.  This is the type
381        * number.
382        */
383       typenum = DEBUG_ReadTypeEnumBackwards(c-1);
384
385       if( ntypes >= MAX_TD_NESTING )
386         {
387           /*
388            * If this ever happens, just bump the counter.
389            */
390           fprintf(stderr, "Typedef nesting overflow\n");
391           return FALSE;
392         }
393
394       switch(c[1])
395         {
396         case '*':
397           stab_types[typenum] = DEBUG_NewDataType(DT_POINTER, NULL);
398           curr_types[ntypes++] = stab_types[typenum];
399           break;
400         case 's':
401         case 'u':
402           stab_types[typenum] = DEBUG_NewDataType(DT_STRUCT, typename);
403           curr_types[ntypes++] = stab_types[typenum];
404           break;
405         case 'a':
406           stab_types[typenum] = DEBUG_NewDataType(DT_ARRAY, NULL);
407           curr_types[ntypes++] = stab_types[typenum];
408           break;
409         case '(':
410         case '1':
411         case 'r':
412           stab_types[typenum] = DEBUG_NewDataType(DT_BASIC, typename);
413           curr_types[ntypes++] = stab_types[typenum];
414           break;
415         case 'x':
416           stab_strcpy(element_name, c + 3);
417           stab_types[typenum] = DEBUG_NewDataType(DT_STRUCT, element_name);
418           curr_types[ntypes++] = stab_types[typenum];
419           break;
420         case 'e':
421           stab_types[typenum] = DEBUG_NewDataType(DT_ENUM, NULL);
422           curr_types[ntypes++] = stab_types[typenum];
423           break;
424         case 'f':
425           stab_types[typenum] = DEBUG_NewDataType(DT_FUNC, NULL);
426           curr_types[ntypes++] = stab_types[typenum];
427           break;
428         default:
429           fprintf(stderr, "Unknown type (%c).\n",c[1]);
430         }
431       typename = NULL;
432     }
433
434       /*
435       * Now register the type so that if we encounter it again, we will know
436       * what to do.
437       */
438      DEBUG_RegisterTypedef(orig_typename, curr_types, ntypes);
439
440      /* 
441       * OK, now take a second sweep through.  Now we will be digging
442       * out the definitions of the various components, and storing
443       * them in the skeletons that we have already allocated.  We take
444       * a right-to left search as this is much easier to parse.  
445       */
446      for( c = strrchr(ptr, '='); c != NULL; c = strrchr(ptr, '=') )
447        {
448          int typenum = DEBUG_ReadTypeEnumBackwards(c-1);
449          curr_type = stab_types[typenum];
450          
451          switch(c[1])
452            {
453            case 'x':
454              tc = c + 3;
455              while( *tc != ':' )
456                  tc++;
457              tc++;
458              if( *tc == '\0' )
459                  *c = '\0';
460              else
461                  strcpy(c, tc);
462              break;
463            case '*':
464            case 'f':
465              tc = c + 2;
466              datatype = stab_types[DEBUG_ReadTypeEnum(&tc)];
467              DEBUG_SetPointerType(curr_type, datatype);
468              if( *tc == '\0' )
469                  *c = '\0';
470              else
471                  strcpy(c, tc);
472              break;
473            case '(':
474            case '1':
475            case 'r':
476              /*
477               * We have already handled these above.
478               */
479              *c = '\0';
480              break;
481            case 'a':
482              /* ar<typeinfo_nodef>;<int>;<int>;<typeinfo>,<int>,<int>;; */
483
484              tc  = c + 3;
485                                                         /* 'r' */
486              DEBUG_ReadTypeEnum(&tc);
487              tc++;                                      /* ';' */
488              arrmin = strtol(tc, &tc, 10);              /* <int> */
489              tc++;                                      /* ';' */
490              arrmax = strtol(tc, &tc, 10);              /* <int> */
491              tc++;                                      /* ';' */
492              datatype = stab_types[DEBUG_ReadTypeEnum(&tc)]; /* <typeinfo> */
493              if( *tc == '\0' )
494                  *c = '\0';
495              else
496                  strcpy(c, tc);
497              DEBUG_SetArrayParams(curr_type, arrmin, arrmax, datatype);
498              break;
499            case 's':
500            case 'u': {
501              int failure = 0;
502
503              tc = c + 2;
504              if( DEBUG_SetStructSize(curr_type, strtol(tc, &tc, 10)) == FALSE )
505                {
506                  /*
507                   * We have already filled out this structure.  Nothing to do,
508                   * so just skip forward to the end of the definition.
509                   */
510                  while( tc[0] != ';' && tc[1] != ';' )
511                      tc++;
512                  
513                  tc += 2;
514                  
515                  if( *tc == '\0' )
516                      *c = '\0';
517                  else
518                      strcpy(c, tc + 1);
519                  continue;
520                }
521
522              /*
523               * Now parse the individual elements of the structure/union.
524               */
525              while(*tc != ';')
526                {
527                  char *ti;
528                  tc2 = element_name;
529                  while(*tc != ':')
530                      *tc2++ = *tc++;
531                  tc++;
532                  *tc2++ = '\0';
533                  ti=tc;
534                  datatype = stab_types[DEBUG_ReadTypeEnum(&tc)];
535                  *tc='\0';
536                  tc++;
537                  offset  = strtol(tc, &tc, 10);
538                  tc++;
539                  size  = strtol(tc, &tc, 10);
540                  tc++;
541                  if (datatype)
542                     DEBUG_AddStructElement(curr_type, element_name, datatype, offset, size);
543                  else {
544                     failure = 1;
545                     /* ... but proceed parsing to the end of the stab */
546                  }
547                }
548
549              if (failure) {
550                 /* if we had a undeclared value this one is undeclared too.
551                  * remove it from the stab_types. 
552                  * I just set it to NULL to detect bugs in my thoughtprocess.
553                  * FIXME: leaks the memory for the structure elements.
554                  * FIXME: such structures should have been optimized away
555                  *        by ld.
556                  */
557                 stab_types[typenum] = NULL;
558              }
559              if( *tc == '\0' )
560                  *c = '\0';
561              else
562                  strcpy(c, tc + 1);
563              break;
564            }
565            case 'e':
566              tc = c + 2;
567              /*
568               * Now parse the individual elements of the structure/union.
569               */
570              while(*tc != ';')
571                {
572                  tc2 = element_name;
573                  while(*tc != ':')
574                      *tc2++ = *tc++;
575                  tc++;
576                  *tc2++ = '\0';
577                  offset  = strtol(tc, &tc, 10);
578                  tc++;
579                  DEBUG_AddStructElement(curr_type, element_name, NULL, offset, 0);
580                }
581              if( *tc == '\0' )
582                  *c = '\0';
583              else
584                  strcpy(c, tc + 1);
585              break;
586            default:
587              fprintf(stderr, "Unknown type (%c).\n",c[1]);
588              break;
589            }
590        }
591      
592      return TRUE;
593
594 }
595
596 static struct datatype *
597 DEBUG_ParseStabType(const char * stab)
598 {
599   char * c;
600
601   /*
602    * Look through the stab definition, and figure out what datatype
603    * this represents.  If we have something we know about, assign the
604    * type.
605    */
606   c = strchr(stab, ':');
607   if( c == NULL )
608       return NULL;
609
610   c++;
611   /*
612    * The next character says more about the type (i.e. data, function, etc)
613    * of symbol.  Skip it.
614    */
615   c++;
616   /* 
617    * The next is either an integer or a (integer,integer).
618    * The DEBUG_ReadTypeEnum takes care that stab_types is large enough.
619    */
620   return stab_types[DEBUG_ReadTypeEnum(&c)];
621 }
622
623 int
624 DEBUG_ParseStabs(char * addr, unsigned int load_offset,
625                  unsigned int staboff, int stablen, 
626                  unsigned int strtaboff, int strtablen)
627 {
628   struct name_hash    * curr_func = NULL;
629   struct wine_locals  * curr_loc = NULL;
630   struct name_hash    * curr_sym = NULL;
631   char                  currpath[PATH_MAX];
632   int                   i;
633   int                   ignore = FALSE;
634   int                   last_nso = -1;
635   int                   len;
636   DBG_ADDR              new_addr;
637   int                   nstab;
638   char                * ptr;
639   char                * stabbuff;
640   int                   stabbufflen;
641   struct stab_nlist   * stab_ptr;
642   char                * strs;
643   int                   strtabinc;
644   char                * subpath = NULL;
645   char                  symname[4096];
646
647   nstab = stablen / sizeof(struct stab_nlist);
648   stab_ptr = (struct stab_nlist *) (addr + staboff);
649   strs  = (char *) (addr + strtaboff);
650
651   memset(currpath, 0, sizeof(currpath));
652
653   /*
654    * Allocate a buffer into which we can build stab strings for cases
655    * where the stab is continued over multiple lines.
656    */
657   stabbufflen = 65536;
658   stabbuff = (char *) xmalloc(stabbufflen);
659
660   strtabinc = 0;
661   stabbuff[0] = '\0';
662   for(i=0; i < nstab; i++, stab_ptr++ )
663     {
664       ptr = strs + (unsigned int) stab_ptr->n_un.n_name;
665       if( ptr[strlen(ptr) - 1] == '\\' )
666         {
667           /*
668            * Indicates continuation.  Append this to the buffer, and go onto the
669            * next record.  Repeat the process until we find a stab without the
670            * '/' character, as this indicates we have the whole thing.
671            */
672           len = strlen(ptr);
673           if( strlen(stabbuff) + len > stabbufflen )
674             {
675               stabbufflen += 65536;
676               stabbuff = (char *) xrealloc(stabbuff, stabbufflen);
677             }
678           strncat(stabbuff, ptr, len - 1);
679           continue;
680         }
681       else if( stabbuff[0] != '\0' )
682         {
683           strcat( stabbuff, ptr);
684           ptr = stabbuff;
685         }
686
687       if( strchr(ptr, '=') != NULL )
688         {
689           /*
690            * The stabs aren't in writable memory, so copy it over so we are
691            * sure we can scribble on it.
692            */
693           if( ptr != stabbuff )
694             {
695               strcpy(stabbuff, ptr);
696               ptr = stabbuff;
697             }
698           stab_strcpy(symname, ptr);
699           DEBUG_ParseTypedefStab(ptr, symname);
700         }
701
702       switch(stab_ptr->n_type)
703         {
704         case N_GSYM:
705           /*
706            * These are useless with ELF.  They have no value, and you have to
707            * read the normal symbol table to get the address.  Thus we
708            * ignore them, and when we process the normal symbol table
709            * we should do the right thing.
710            *
711            * With a.out, they actually do make some amount of sense.
712            */
713           new_addr.seg = 0;
714           new_addr.type = DEBUG_ParseStabType(ptr);
715           new_addr.off = load_offset + stab_ptr->n_value;
716
717           stab_strcpy(symname, ptr);
718 #ifdef __ELF__
719           curr_sym = DEBUG_AddSymbol( symname, &new_addr, currpath,
720                                       SYM_WINE | SYM_DATA | SYM_INVALID);
721 #else
722           curr_sym = DEBUG_AddSymbol( symname, &new_addr, currpath, 
723                                       SYM_WINE | SYM_DATA );
724 #endif
725           break;
726         case N_RBRAC:
727         case N_LBRAC:
728           /*
729            * We need to keep track of these so we get symbol scoping
730            * right for local variables.  For now, we just ignore them.
731            * The hooks are already there for dealing with this however,
732            * so all we need to do is to keep count of the nesting level,
733            * and find the RBRAC for each matching LBRAC.
734            */
735           break;
736         case N_LCSYM:
737         case N_STSYM:
738           /*
739            * These are static symbols and BSS symbols.
740            */
741           new_addr.seg = 0;
742           new_addr.type = DEBUG_ParseStabType(ptr);
743           new_addr.off = load_offset + stab_ptr->n_value;
744
745           stab_strcpy(symname, ptr);
746           curr_sym = DEBUG_AddSymbol( symname, &new_addr, currpath, 
747                                       SYM_WINE | SYM_DATA );
748           break;
749         case N_PSYM:
750           /*
751            * These are function parameters.
752            */
753           if(     (curr_func != NULL)
754                && (stab_ptr->n_value != 0) )
755             {
756               stab_strcpy(symname, ptr);
757               curr_loc = DEBUG_AddLocal(curr_func, 0, 
758                                         stab_ptr->n_value, 0, 0, symname);
759               DEBUG_SetLocalSymbolType( curr_loc, DEBUG_ParseStabType(ptr));
760             }
761           break;
762         case N_RSYM:
763           if( curr_func != NULL )
764             {
765               stab_strcpy(symname, ptr);
766               curr_loc = DEBUG_AddLocal(curr_func, stab_ptr->n_value, 0, 0, 0, symname);
767               DEBUG_SetLocalSymbolType( curr_loc, DEBUG_ParseStabType(ptr));
768             }
769           break;
770         case N_LSYM:
771           if(     (curr_func != NULL)
772                && (stab_ptr->n_value != 0) )
773             {
774               stab_strcpy(symname, ptr);
775               DEBUG_AddLocal(curr_func, 0, 
776                              stab_ptr->n_value, 0, 0, symname);
777             }
778           else if (curr_func == NULL)
779             {
780               stab_strcpy(symname, ptr);
781             }
782           break;
783         case N_SLINE:
784           /*
785            * This is a line number.  These are always relative to the start
786            * of the function (N_FUN), and this makes the lookup easier.
787            */
788           if( curr_func != NULL )
789             {
790 #ifdef __ELF__
791               DEBUG_AddLineNumber(curr_func, stab_ptr->n_desc, 
792                                   stab_ptr->n_value);
793 #else
794 #if 0
795               /*
796                * This isn't right.  The order of the stabs is different under
797                * a.out, and as a result we would end up attaching the line
798                * number to the wrong function.
799                */
800               DEBUG_AddLineNumber(curr_func, stab_ptr->n_desc, 
801                                   stab_ptr->n_value - curr_func->addr.off);
802 #endif
803 #endif
804             }
805           break;
806         case N_FUN:
807           /*
808            * First, clean up the previous function we were working on.
809            */
810           DEBUG_Normalize(curr_func);
811
812           /*
813            * For now, just declare the various functions.  Later
814            * on, we will add the line number information and the
815            * local symbols.
816            */
817           if( !ignore )
818             {
819               new_addr.seg = 0;
820               new_addr.type = DEBUG_ParseStabType(ptr);
821               new_addr.off = load_offset + stab_ptr->n_value;
822               /*
823                * Copy the string to a temp buffer so we
824                * can kill everything after the ':'.  We do
825                * it this way because otherwise we end up dirtying
826                * all of the pages related to the stabs, and that
827                * sucks up swap space like crazy.
828                */
829               stab_strcpy(symname, ptr);
830               curr_func = DEBUG_AddSymbol( symname, &new_addr, currpath,
831                                            SYM_WINE | SYM_FUNC);
832             }
833           else
834             {
835               /*
836                * Don't add line number information for this function
837                * any more.
838                */
839               curr_func = NULL;
840             }
841           break;
842         case N_SO:
843           /*
844            * This indicates a new source file.  Append the records
845            * together, to build the correct path name.
846            */
847 #ifndef __ELF__
848           /*
849            * With a.out, there is no NULL string N_SO entry at the end of
850            * the file.  Thus when we find non-consecutive entries,
851            * we consider that a new file is started.
852            */
853           if( last_nso < i-1 )
854             {
855               currpath[0] = '\0';
856               DEBUG_Normalize(curr_func);
857               curr_func = NULL;
858             }
859 #endif
860
861           if( *ptr == '\0' )
862             {
863               /*
864                * Nuke old path.
865                */
866               currpath[0] = '\0';
867               DEBUG_Normalize(curr_func);
868               curr_func = NULL;
869               /*
870                * The datatypes that we would need to use are reset when
871                * we start a new file.
872                */
873               memset(stab_types, 0, num_stab_types * sizeof(stab_types[0]));
874               /*
875               for (i=0;i<nrofnroftypenums;i++)
876                 memset(typenums[i],0,sizeof(typenums[i][0])*nroftypenums[i]);
877                */
878             }
879           else
880             {
881               if (*ptr != '/')
882                 strcat(currpath, ptr);
883               else
884                 strcpy(currpath, ptr);
885               subpath = ptr;
886             }
887           last_nso = i;
888           break;
889         case N_SOL:
890           /*
891            * This indicates we are including stuff from an include file.
892            * If this is the main source, enable the debug stuff, otherwise
893            * ignore it.
894            */
895           if( subpath == NULL || strcmp(ptr, subpath) == 0 )
896             {
897               ignore = FALSE;
898             }
899           else
900             {
901               ignore = TRUE;
902               DEBUG_Normalize(curr_func);
903               curr_func = NULL;
904             }
905           break;
906         case N_UNDF:
907           strs += strtabinc;
908           strtabinc = stab_ptr->n_value;
909           DEBUG_Normalize(curr_func);
910           curr_func = NULL;
911           break;
912         case N_OPT:
913           /*
914            * Ignore this.  We don't care what it points to.
915            */
916           break;
917         case N_BINCL:
918         case N_EINCL:
919         case N_MAIN:
920           /*
921            * Always ignore these.  GCC doesn't even generate them.
922            */
923           break;
924         default:
925           break;
926         }
927
928       stabbuff[0] = '\0';
929
930 #if 0
931       fprintf(stderr, "%d %x %s\n", stab_ptr->n_type, 
932               (unsigned int) stab_ptr->n_value,
933               strs + (unsigned int) stab_ptr->n_un.n_name);
934 #endif
935     }
936
937   if( stab_types != NULL )
938     {
939       free(stab_types);
940       stab_types = NULL;
941       num_stab_types = 0;
942     }
943
944
945   DEBUG_FreeRegisteredTypedefs();
946
947   return TRUE;
948 }
949
950 #ifdef __ELF__
951
952 /*
953  * Walk through the entire symbol table and add any symbols we find there.
954  * This can be used in cases where we have stripped ELF shared libraries,
955  * or it can be used in cases where we have data symbols for which the address
956  * isn't encoded in the stabs.
957  *
958  * This is all really quite easy, since we don't have to worry about line
959  * numbers or local data variables.
960  */
961 static
962 int
963 DEBUG_ProcessElfSymtab(char * addr, unsigned int load_offset,
964                        Elf32_Shdr * symtab, Elf32_Shdr * strtab)
965 {
966   char          * curfile = NULL;
967   struct name_hash * curr_sym = NULL;
968   int             flags;
969   int             i;
970   DBG_ADDR        new_addr;
971   int             nsym;
972   char          * strp;
973   char          * symname;
974   Elf32_Sym     * symp;
975
976
977   symp = (Elf32_Sym *) (addr + symtab->sh_offset);
978   nsym = symtab->sh_size / sizeof(*symp);
979   strp = (char *) (addr + strtab->sh_offset);
980
981   for(i=0; i < nsym; i++, symp++)
982     {
983       /*
984        * Ignore certain types of entries which really aren't of that much
985        * interest.
986        */
987       if( ELF32_ST_TYPE(symp->st_info) == STT_SECTION )
988         {
989           continue;
990         }
991
992       symname = strp + symp->st_name;
993
994       /*
995        * Save the name of the current file, so we have a way of tracking
996        * static functions/data.
997        */
998       if( ELF32_ST_TYPE(symp->st_info) == STT_FILE )
999         {
1000           curfile = symname;
1001           continue;
1002         }
1003
1004
1005       /*
1006        * See if we already have something for this symbol.
1007        * If so, ignore this entry, because it would have come from the
1008        * stabs or from a previous symbol.  If the value is different,
1009        * we will have to keep the darned thing, because there can be
1010        * multiple local symbols by the same name.
1011        */
1012       if(    (DEBUG_GetSymbolValue(symname, -1, &new_addr, FALSE ) == TRUE)
1013           && (new_addr.off == (load_offset + symp->st_value)) )
1014           continue;
1015
1016       new_addr.seg = 0;
1017       new_addr.type = NULL;
1018       new_addr.off = load_offset + symp->st_value;
1019       flags = SYM_WINE | (ELF32_ST_BIND(symp->st_info) == STT_FUNC 
1020                           ? SYM_FUNC : SYM_DATA);
1021       if( ELF32_ST_BIND(symp->st_info) == STB_GLOBAL )
1022           curr_sym = DEBUG_AddSymbol( symname, &new_addr, NULL, flags );
1023       else
1024           curr_sym = DEBUG_AddSymbol( symname, &new_addr, curfile, flags );
1025
1026       /*
1027        * Record the size of the symbol.  This can come in handy in
1028        * some cases.  Not really used yet, however.
1029        */
1030       if(  symp->st_size != 0 )
1031           DEBUG_SetSymbolSize(curr_sym, symp->st_size);
1032     }
1033
1034   return TRUE;
1035 }
1036
1037 static
1038 int
1039 DEBUG_ProcessElfObject(char * filename, unsigned int load_offset)
1040 {
1041   int                   rtn = FALSE;
1042   struct stat           statbuf;
1043   int                   fd = -1;
1044   int                   status;
1045   char                * addr = (char *) 0xffffffff;
1046   Elf32_Ehdr          * ehptr;
1047   Elf32_Shdr          * spnt;
1048   char                * shstrtab;
1049   int                   nsect;
1050   int                   i;
1051   int                   stabsect;
1052   int                   stabstrsect;
1053
1054
1055   /*
1056    * Make sure we can stat and open this file.
1057    */
1058   if( filename == NULL )
1059       goto leave;
1060
1061   status = stat(filename, &statbuf);
1062   if( status == -1 )
1063     {
1064       char *s,*t,*fn,*paths;
1065       if (strchr(filename,'/'))
1066         goto leave;
1067       paths = xstrdup(getenv("PATH"));
1068       s = paths;
1069       while (s && *s) {
1070         t = strchr(s,':');
1071         if (t) *t='\0';
1072         fn = (char*)xmalloc(strlen(filename)+1+strlen(s)+1);
1073         strcpy(fn,s);
1074         strcat(fn,"/");
1075         strcat(fn,filename);
1076         if ((rtn = DEBUG_ProcessElfObject(fn,load_offset))) {
1077                 free(fn);
1078                 free(paths);
1079                 goto leave;
1080         }
1081         free(fn);
1082         if (t) s = t+1; else break;
1083       }
1084       if (!s || !*s) fprintf(stderr," not found");
1085       free(paths);
1086       goto leave;
1087     }
1088
1089   /*
1090    * Now open the file, so that we can mmap() it.
1091    */
1092   fd = open(filename, O_RDONLY);
1093   if( fd == -1 )
1094       goto leave;
1095
1096
1097   /*
1098    * Now mmap() the file.
1099    */
1100   addr = mmap(0, statbuf.st_size, PROT_READ, 
1101               MAP_PRIVATE, fd, 0);
1102   if( addr == (char *) 0xffffffff )
1103       goto leave;
1104
1105   /*
1106    * Next, we need to find a few of the internal ELF headers within
1107    * this thing.  We need the main executable header, and the section
1108    * table.
1109    */
1110   ehptr = (Elf32_Ehdr *) addr;
1111
1112   if( load_offset == 0 )
1113       DEBUG_RegisterELFDebugInfo(ehptr->e_entry, statbuf.st_size, filename);
1114   else
1115       DEBUG_RegisterELFDebugInfo(load_offset, statbuf.st_size, filename);
1116
1117   spnt = (Elf32_Shdr *) (addr + ehptr->e_shoff);
1118   nsect = ehptr->e_shnum;
1119   shstrtab = (addr + spnt[ehptr->e_shstrndx].sh_offset);
1120
1121   stabsect = stabstrsect = -1;
1122
1123   for(i=0; i < nsect; i++)
1124     {
1125       if( strcmp(shstrtab + spnt[i].sh_name, ".stab") == 0 )
1126           stabsect = i;
1127
1128       if( strcmp(shstrtab + spnt[i].sh_name, ".stabstr") == 0 )
1129           stabstrsect = i;
1130     }
1131
1132   if( stabsect == -1 || stabstrsect == -1 )
1133       goto leave;
1134
1135   /*
1136    * OK, now just parse all of the stabs.
1137    */
1138   rtn = DEBUG_ParseStabs(addr, load_offset, 
1139                          spnt[stabsect].sh_offset,
1140                          spnt[stabsect].sh_size,
1141                          spnt[stabstrsect].sh_offset,
1142                          spnt[stabstrsect].sh_size);
1143
1144   if( rtn != TRUE )
1145       goto leave;
1146
1147   for(i=0; i < nsect; i++)
1148     {
1149       if(    (strcmp(shstrtab + spnt[i].sh_name, ".symtab") == 0)
1150           && (spnt[i].sh_type == SHT_SYMTAB) )
1151           DEBUG_ProcessElfSymtab(addr, load_offset, 
1152                                  spnt + i, spnt + spnt[i].sh_link);
1153
1154       if(    (strcmp(shstrtab + spnt[i].sh_name, ".dynsym") == 0)
1155           && (spnt[i].sh_type == SHT_DYNSYM) )
1156           DEBUG_ProcessElfSymtab(addr, load_offset, 
1157                                  spnt + i, spnt + spnt[i].sh_link);
1158     }
1159
1160 leave:
1161
1162   if( addr != (char *) 0xffffffff )
1163       munmap(addr, statbuf.st_size);
1164
1165   if( fd != -1 )
1166       close(fd);
1167
1168   return (rtn);
1169
1170 }
1171
1172 int
1173 DEBUG_ReadExecutableDbgInfo(void)
1174 {
1175   Elf32_Ehdr          * ehdr;
1176   char                * exe_name;
1177   Elf32_Dyn           * dynpnt;
1178   struct r_debug      * dbg_hdr;
1179   struct link_map     * lpnt = NULL;
1180   extern Elf32_Dyn      _DYNAMIC[];
1181   int                   rtn = FALSE;
1182   int                   rowcount;
1183
1184   exe_name = DEBUG_argv0;
1185
1186   /*
1187    * Make sure we can stat and open this file.
1188    */
1189   if( exe_name == NULL )
1190       goto leave;
1191
1192   fprintf( stderr, "Loading symbols: %s", exe_name );
1193   rowcount = 17 + strlen(exe_name);
1194   DEBUG_ProcessElfObject(exe_name, 0);
1195
1196   /*
1197    * Finally walk the tables that the dynamic loader maintains to find all
1198    * of the other shared libraries which might be loaded.  Perform the
1199    * same step for all of these.
1200    */
1201   dynpnt = _DYNAMIC;
1202   if( dynpnt == NULL )
1203       goto leave;
1204
1205   /*
1206    * Now walk the dynamic section (of the executable, looking for a DT_DEBUG
1207    * entry.
1208    */
1209   for(; dynpnt->d_tag != DT_NULL; dynpnt++)
1210       if( dynpnt->d_tag == DT_DEBUG )
1211           break;
1212
1213   if(    (dynpnt->d_tag != DT_DEBUG)
1214       || (dynpnt->d_un.d_ptr == 0) )
1215       goto leave;
1216
1217   /*
1218    * OK, now dig into the actual tables themselves.
1219    */
1220   dbg_hdr = (struct r_debug *) dynpnt->d_un.d_ptr;
1221   lpnt = dbg_hdr->r_map;
1222
1223   /*
1224    * Now walk the linked list.  In all known ELF implementations,
1225    * the dynamic loader maintains this linked list for us.  In some
1226    * cases the first entry doesn't appear with a name, in other cases it
1227    * does.
1228    */
1229   for(; lpnt; lpnt = lpnt->l_next )
1230     {
1231       /*
1232        * We already got the stuff for the executable using the
1233        * argv[0] entry above.  Here we only need to concentrate on any
1234        * shared libraries which may be loaded.
1235        */
1236       ehdr = (Elf32_Ehdr *) lpnt->l_addr;
1237       if( (lpnt->l_addr == 0) || (ehdr->e_type != ET_DYN) )
1238           continue;
1239
1240       if( lpnt->l_name != NULL )
1241       {
1242           if (rowcount + strlen(lpnt->l_name) > 76)
1243           {
1244               fprintf( stderr, "\n   " );
1245               rowcount = 3;
1246           }
1247           fprintf( stderr, " %s", lpnt->l_name );
1248           rowcount += strlen(lpnt->l_name) + 1;
1249           DEBUG_ProcessElfObject(lpnt->l_name, lpnt->l_addr);
1250       }
1251     }
1252
1253   rtn = TRUE;
1254
1255 leave:
1256   fprintf( stderr, "\n" );
1257   return (rtn);
1258
1259 }
1260
1261 #else   /* !__ELF__ */
1262
1263 #ifdef linux
1264 /*
1265  * a.out linux.
1266  */
1267 int
1268 DEBUG_ReadExecutableDbgInfo(void)
1269 {
1270   char                * addr = (char *) 0xffffffff;
1271   char                * exe_name;
1272   struct exec         * ahdr;
1273   int                   fd = -1;
1274   int                   rtn = FALSE;
1275   unsigned int          staboff;
1276   struct stat           statbuf;
1277   int                   status;
1278   unsigned int          stroff;
1279
1280   exe_name = DEBUG_argv0;
1281
1282   /*
1283    * Make sure we can stat and open this file.
1284    */
1285   if( exe_name == NULL )
1286       goto leave;
1287
1288   status = stat(exe_name, &statbuf);
1289   if( status == -1 )
1290       goto leave;
1291
1292   /*
1293    * Now open the file, so that we can mmap() it.
1294    */
1295   fd = open(exe_name, O_RDONLY);
1296   if( fd == -1 )
1297       goto leave;
1298
1299
1300   /*
1301    * Now mmap() the file.
1302    */
1303   addr = mmap(0, statbuf.st_size, PROT_READ, 
1304               MAP_PRIVATE, fd, 0);
1305   if( addr == (char *) 0xffffffff )
1306       goto leave;
1307
1308   ahdr = (struct exec *) addr;
1309
1310   staboff = N_SYMOFF(*ahdr);
1311   stroff = N_STROFF(*ahdr);
1312   rtn = DEBUG_ParseStabs(addr, 0, 
1313                          staboff, 
1314                          ahdr->a_syms,
1315                          stroff,
1316                          statbuf.st_size - stroff);
1317
1318   /*
1319    * Give a nice status message here...
1320    */
1321   fprintf( stderr, "Loading symbols: %s", exe_name );
1322
1323   rtn = TRUE;
1324
1325 leave:
1326
1327   if( addr != (char *) 0xffffffff )
1328       munmap(addr, statbuf.st_size);
1329
1330   if( fd != -1 )
1331       close(fd);
1332
1333   return (rtn);
1334
1335 }
1336 #else
1337 /*
1338  * Non-linux, non-ELF platforms.
1339  */
1340 int
1341 DEBUG_ReadExecutableDbgInfo(void)
1342 {
1343 return FALSE;
1344 }
1345 #endif
1346
1347 #endif  /* __ELF__ */