Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include "elf.h"
5 #include "dwarf.h"
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;
16 b.d = d;
17 b.p = bl->data;
18 b.ep = b.p + bl->len;
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 }
62 int
63 dwarflookupname(Dwarf *d, char *name, DwarfSym *sym)
64 {
65 return _dwarfnametounit(d, name, &d->pubnames, sym);
66 }
68 /*
70 int
71 dwarflookuptype(Dwarf *d, char *name, DwarfSym *sym)
72 {
73 return _dwarfnametounit(d, name, &d->pubtypes, sym);
74 }
76 */