Blame


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