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