blob: 68ff911605745af41b119a5e45d5422ab422b430 [file] [log] [blame]
rsca84cbb22004-04-19 19:29:25 +00001#include <u.h>
2#include <libc.h>
3#include <bio.h>
4#include "elf.h"
5#include "dwarf.h"
6
7static 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;
rsc95f57b02004-04-21 02:03:00 +000047 if(dwarfnextsym(d, s) < 0)
rsca84cbb22004-04-19 19:29:25 +000048 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
62int
63dwarflookupname(Dwarf *d, char *name, DwarfSym *sym)
64{
65 return _dwarfnametounit(d, name, &d->pubnames, sym);
66}
67
68/*
69
70int
71dwarflookuptype(Dwarf *d, char *name, DwarfSym *sym)
72{
73 return _dwarfnametounit(d, name, &d->pubtypes, sym);
74}
75
76 */