Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygendwarfaranges.c
Go to the documentation of this file.
00001 /* 00002 * Dwarf address ranges parsing code. 00003 */ 00004 00005 #define NTOSAPI 00006 #include <ntddk.h> 00007 #include <reactos/rossym.h> 00008 #include "rossympriv.h" 00009 #include <ntimage.h> 00010 00011 #define NDEBUG 00012 #include <debug.h> 00013 00014 #include "dwarf.h" 00015 00016 int 00017 dwarfaddrtounit(Dwarf *d, ulong addr, ulong *unit) 00018 { 00019 DwarfBuf b; 00020 int segsize, i; 00021 ulong len, id, off, base, size; 00022 uchar *start, *end; 00023 00024 memset(&b, 0, sizeof b); 00025 b.d = d; 00026 b.p = d->aranges.data; 00027 b.ep = b.p + d->aranges.len; 00028 00029 while(b.p < b.ep){ 00030 start = b.p; 00031 len = dwarfget4(&b); 00032 if (!len) { b.ep = b.p - 4; return -1; } 00033 if((id = dwarfget2(&b)) != 2){ 00034 if(b.p == nil){ 00035 underflow: 00036 werrstr("buffer underflow reading address ranges header"); 00037 }else 00038 werrstr("bad dwarf version 0x%x in address ranges header", id); 00039 return -1; 00040 } 00041 off = dwarfget4(&b); 00042 b.addrsize = dwarfget1(&b); 00043 if(d->addrsize == 0) 00044 d->addrsize = b.addrsize; 00045 segsize = dwarfget1(&b); 00046 USED(segsize); /* what am i supposed to do with this? */ 00047 if(b.p == nil) 00048 goto underflow; 00049 if((i = (b.p-start) % (2*b.addrsize)) != 0) 00050 b.p += 2*b.addrsize - i; 00051 end = start+4+len; 00052 while(b.p!=nil && b.p<end){ 00053 base = dwarfgetaddr(&b); 00054 size = dwarfgetaddr(&b); 00055 if (!size) continue; 00056 if(b.p == nil) 00057 goto underflow; 00058 if(base <= addr && addr < base+size){ 00059 *unit = off; 00060 return 0; 00061 } 00062 } 00063 if(b.p == nil) 00064 goto underflow; 00065 b.p = end; 00066 } 00067 werrstr("address 0x%lux is not listed in dwarf debugging symbols", addr); 00068 return -1; 00069 } 00070 00071 Generated on Sat May 26 2012 04:35:17 for ReactOS by
1.7.6.1
|