Blame


1 a84cbb2a 2004-04-19 devnull /*
2 a84cbb2a 2004-04-19 devnull * Dwarf address ranges parsing code.
3 a84cbb2a 2004-04-19 devnull */
4 a84cbb2a 2004-04-19 devnull
5 a84cbb2a 2004-04-19 devnull #include <u.h>
6 a84cbb2a 2004-04-19 devnull #include <libc.h>
7 a84cbb2a 2004-04-19 devnull #include <bio.h>
8 a84cbb2a 2004-04-19 devnull #include "elf.h"
9 a84cbb2a 2004-04-19 devnull #include "dwarf.h"
10 a84cbb2a 2004-04-19 devnull
11 a84cbb2a 2004-04-19 devnull int
12 a84cbb2a 2004-04-19 devnull dwarfaddrtounit(Dwarf *d, ulong addr, ulong *unit)
13 a84cbb2a 2004-04-19 devnull {
14 a84cbb2a 2004-04-19 devnull DwarfBuf b;
15 a84cbb2a 2004-04-19 devnull int segsize, i;
16 a84cbb2a 2004-04-19 devnull ulong len, id, off, base, size;
17 a84cbb2a 2004-04-19 devnull uchar *start, *end;
18 a84cbb2a 2004-04-19 devnull
19 a84cbb2a 2004-04-19 devnull memset(&b, 0, sizeof b);
20 a84cbb2a 2004-04-19 devnull b.d = d;
21 a84cbb2a 2004-04-19 devnull b.p = d->aranges.data;
22 a84cbb2a 2004-04-19 devnull b.ep = b.p + d->aranges.len;
23 a84cbb2a 2004-04-19 devnull
24 a84cbb2a 2004-04-19 devnull while(b.p < b.ep){
25 a84cbb2a 2004-04-19 devnull start = b.p;
26 a84cbb2a 2004-04-19 devnull len = dwarfget4(&b);
27 a84cbb2a 2004-04-19 devnull if((id = dwarfget2(&b)) != 2){
28 a84cbb2a 2004-04-19 devnull if(b.p == nil){
29 a84cbb2a 2004-04-19 devnull underflow:
30 a84cbb2a 2004-04-19 devnull werrstr("buffer underflow reading address ranges header");
31 a84cbb2a 2004-04-19 devnull }else
32 a84cbb2a 2004-04-19 devnull werrstr("bad dwarf version 0x%lux in address ranges header", id);
33 a84cbb2a 2004-04-19 devnull return -1;
34 a84cbb2a 2004-04-19 devnull }
35 a84cbb2a 2004-04-19 devnull off = dwarfget4(&b);
36 a84cbb2a 2004-04-19 devnull b.addrsize = dwarfget1(&b);
37 a84cbb2a 2004-04-19 devnull if(d->addrsize == 0)
38 a84cbb2a 2004-04-19 devnull d->addrsize = b.addrsize;
39 a84cbb2a 2004-04-19 devnull segsize = dwarfget1(&b);
40 a84cbb2a 2004-04-19 devnull USED(segsize); /* what am i supposed to do with this? */
41 a84cbb2a 2004-04-19 devnull if(b.p == nil)
42 a84cbb2a 2004-04-19 devnull goto underflow;
43 a84cbb2a 2004-04-19 devnull if((i = (b.p-start) % (2*b.addrsize)) != 0)
44 a84cbb2a 2004-04-19 devnull b.p += 2*b.addrsize - i;
45 a84cbb2a 2004-04-19 devnull end = start+4+len;
46 a84cbb2a 2004-04-19 devnull while(b.p!=nil && b.p<end){
47 a84cbb2a 2004-04-19 devnull base = dwarfgetaddr(&b);
48 a84cbb2a 2004-04-19 devnull size = dwarfgetaddr(&b);
49 a84cbb2a 2004-04-19 devnull if(b.p == nil)
50 a84cbb2a 2004-04-19 devnull goto underflow;
51 a84cbb2a 2004-04-19 devnull if(base <= addr && addr < base+size){
52 a84cbb2a 2004-04-19 devnull *unit = off;
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 if(b.p == nil)
57 a84cbb2a 2004-04-19 devnull goto underflow;
58 a84cbb2a 2004-04-19 devnull b.p = end;
59 a84cbb2a 2004-04-19 devnull }
60 a84cbb2a 2004-04-19 devnull werrstr("address 0x%lux is not listed in dwarf debugging symbols", addr);
61 a84cbb2a 2004-04-19 devnull return -1;
62 a84cbb2a 2004-04-19 devnull }