libmach
This commit is contained in:
parent
0e3cc9f456
commit
a84cbb2a17
53 changed files with 12038 additions and 0 deletions
63
src/libmach/dwarfaranges.c
Normal file
63
src/libmach/dwarfaranges.c
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
/*
|
||||
* Dwarf address ranges parsing code.
|
||||
*/
|
||||
|
||||
#include <u.h>
|
||||
#include <libc.h>
|
||||
#include <bio.h>
|
||||
#include "elf.h"
|
||||
#include "dwarf.h"
|
||||
|
||||
int
|
||||
dwarfaddrtounit(Dwarf *d, ulong addr, ulong *unit)
|
||||
{
|
||||
DwarfBuf b;
|
||||
int segsize, i;
|
||||
ulong len, id, off, base, size;
|
||||
uchar *start, *end;
|
||||
|
||||
memset(&b, 0, sizeof b);
|
||||
b.d = d;
|
||||
b.p = d->aranges.data;
|
||||
b.ep = b.p + d->aranges.len;
|
||||
|
||||
while(b.p < b.ep){
|
||||
start = b.p;
|
||||
len = dwarfget4(&b);
|
||||
if((id = dwarfget2(&b)) != 2){
|
||||
if(b.p == nil){
|
||||
underflow:
|
||||
werrstr("buffer underflow reading address ranges header");
|
||||
}else
|
||||
werrstr("bad dwarf version 0x%lux in address ranges header", id);
|
||||
return -1;
|
||||
}
|
||||
off = dwarfget4(&b);
|
||||
b.addrsize = dwarfget1(&b);
|
||||
if(d->addrsize == 0)
|
||||
d->addrsize = b.addrsize;
|
||||
segsize = dwarfget1(&b);
|
||||
USED(segsize); /* what am i supposed to do with this? */
|
||||
if(b.p == nil)
|
||||
goto underflow;
|
||||
if((i = (b.p-start) % (2*b.addrsize)) != 0)
|
||||
b.p += 2*b.addrsize - i;
|
||||
end = start+4+len;
|
||||
while(b.p!=nil && b.p<end){
|
||||
base = dwarfgetaddr(&b);
|
||||
size = dwarfgetaddr(&b);
|
||||
if(b.p == nil)
|
||||
goto underflow;
|
||||
if(base <= addr && addr < base+size){
|
||||
*unit = off;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if(b.p == nil)
|
||||
goto underflow;
|
||||
b.p = end;
|
||||
}
|
||||
werrstr("address 0x%lux is not listed in dwarf debugging symbols", addr);
|
||||
return -1;
|
||||
}
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue