xref: /reactos/sdk/lib/rossym/dwarfpubnames.c (revision 84ccccab)
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