1 #define NTOSAPI 2 #include <ntddk.h> 3 #include <reactos/rossym.h> 4 #include <ntimage.h> 5 6 #define NDEBUG 7 #include <debug.h> 8 9 #include "dwarf.h" 10 11 static int 12 _dwarfnametounit(Dwarf *d, char *name, DwarfBlock *bl, DwarfSym *s) 13 { 14 int vers; 15 ulong len, unit, off; 16 uchar *next; 17 char *str; 18 DwarfBuf b; 19 20 b.d = d; 21 b.p = bl->data; 22 b.ep = b.p + bl->len; 23 24 while(b.p < b.ep){ 25 len = dwarfget4(&b); 26 if(len > b.ep-b.p){ 27 werrstr("bad length in dwarf name header"); 28 return -1; 29 } 30 next = b.p + len; 31 vers = dwarfget2(&b); 32 if(vers != 1 && vers != 2){ 33 werrstr("bad version %d in dwarf name header", vers); 34 return -1; 35 } 36 unit = dwarfget4(&b); 37 dwarfget4(&b); /* unit length */ 38 while(b.p < next){ 39 off = dwarfget4(&b); 40 if(off == 0) 41 break; 42 str = dwarfgetstring(&b); 43 if(strcmp(str, name) == 0){ 44 if(dwarfenumunit(d, unit, s) < 0) 45 return -1; 46 if(unit + off >= s->b.ep - d->info.data){ 47 werrstr("bad offset in name entry"); 48 return -1; 49 } 50 s->b.p = d->info.data + unit + off; 51 if(dwarfnextsym(d, s) < 0) 52 return -1; 53 if(s->attrs.name==nil || strcmp(s->attrs.name, name)!=0){ 54 werrstr("unexpected name %#q in lookup for %#q", s->attrs.name, name); 55 return -1; 56 } 57 return 0; 58 } 59 } 60 b.p = next; 61 } 62 werrstr("unknown name '%s'", name); 63 return -1; 64 } 65 66 int 67 dwarflookupname(Dwarf *d, char *name, DwarfSym *sym) 68 { 69 return _dwarfnametounit(d, name, &d->pubnames, sym); 70 } 71 72 /* 73 74 int 75 dwarflookuptype(Dwarf *d, char *name, DwarfSym *sym) 76 { 77 return _dwarfnametounit(d, name, &d->pubtypes, sym); 78 } 79 80 */ 81 82