[LWIP] Fix src/core/init.c a bit (#1620)
[reactos.git] / sdk / lib / rossym / dwarfaranges.c
1 /*
2 * Dwarf address ranges parsing code.
3 */
4
5 #define NTOSAPI
6 #include <ntddk.h>
7 #include <reactos/rossym.h>
8 #include "rossympriv.h"
9 #include <ntimage.h>
10
11 #define NDEBUG
12 #include <debug.h>
13
14 #include "dwarf.h"
15
16 int
17 dwarfaddrtounit(Dwarf *d, ulong addr, ulong *unit)
18 {
19 DwarfBuf b;
20 int segsize, i;
21 ulong len, id, off, base, size;
22 uchar *start, *end;
23
24 memset(&b, 0, sizeof b);
25 b.d = d;
26 b.p = d->aranges.data;
27 b.ep = b.p + d->aranges.len;
28
29 while(b.p < b.ep){
30 start = b.p;
31 len = dwarfget4(&b);
32 if (!len) { b.ep = b.p - 4; return -1; }
33 if((id = dwarfget2(&b)) != 2){
34 if(b.p == nil){
35 underflow:
36 werrstr("buffer underflow reading address ranges header");
37 }else
38 werrstr("bad dwarf version 0x%x in address ranges header", id);
39 return -1;
40 }
41 off = dwarfget4(&b);
42 b.addrsize = dwarfget1(&b);
43 if(d->addrsize == 0)
44 d->addrsize = b.addrsize;
45 segsize = dwarfget1(&b);
46 USED(segsize); /* what am i supposed to do with this? */
47 if(b.p == nil)
48 goto underflow;
49 if((i = (b.p-start) % (2*b.addrsize)) != 0)
50 b.p += 2*b.addrsize - i;
51 end = start+4+len;
52 while(b.p!=nil && b.p<end){
53 base = dwarfgetaddr(&b);
54 size = dwarfgetaddr(&b);
55 if (!size) continue;
56 if(b.p == nil)
57 goto underflow;
58 if(base <= addr && addr < base+size){
59 *unit = off;
60 return 0;
61 }
62 }
63 if(b.p == nil)
64 goto underflow;
65 b.p = end;
66 }
67 werrstr("address 0x%lux is not listed in dwarf debugging symbols", addr);
68 return -1;
69 }
70
71