drd64_libgoblin_dwarf_abbrev.o \
drd64_libgoblin_dwarf_info.o \
drd64_libgoblin_dwarf_line.o \
+ drd64_libgoblin_dwarf_tag.o \
drd64_libgoblin_dwarf_common.o \
drd64_libgoblin_debug_elf.o \
drd64_libgoblin_debug_objinfo.o
drd64_libgoblin_dwarf_abbrev.h \
drd64_libgoblin_dwarf_info.h \
drd64_libgoblin_dwarf_line.h \
+ drd64_libgoblin_dwarf_tag.h \
drd64_libgoblin_dwarf_common.h \
drd64_libgoblin_dwarf_str.h \
drd64_libgoblin_debug_elf.h \
drd64_libgoblin_dwarf_line.c $(HEADER)
$(CC) -c -o drd64_libgoblin_dwarf_line.o $(FLAGS_DEBUG) \
drd64_libgoblin_dwarf_line.c
+drd64_libgoblin_dwarf_tag.o: \
+ drd64_libgoblin_dwarf_tag.c $(HEADER)
+ $(CC) -c -o drd64_libgoblin_dwarf_tag.o $(FLAGS_DEBUG) \
+ drd64_libgoblin_dwarf_tag.c
drd64_libgoblin_dwarf_common.o: drd64_libgoblin_dwarf_common.c $(HEADER)
$(CC) -c -o drd64_libgoblin_dwarf_common.o $(FLAGS_DEBUG) \
drd64_libgoblin_dwarf_common.c
#include"drd64_libgoblin_dwarf_abbrev.h"
#include"drd64_libgoblin_dwarf_info.h"
#include"drd64_libgoblin_dwarf_line.h"
+#include"drd64_libgoblin_dwarf_tag.h"
#include"drd64_libgoblin_dwarf.h"
#include"drd64_libgoblin_dwarf_str.h"
#include"drd64_libgoblin_debug_elf.h"
if( NULL != p_binfile->dwarf.p_abbrev ) {
free( p_binfile->dwarf.p_abbrev );
- p_binfile->dwarf.p_abbrev = NULL;
- p_binfile->dwarf.i_abbrevs = 0;
+ p_binfile->dwarf.p_abbrev = NULL;
+ p_binfile->dwarf.i_abbrevs_alloc = 0;
+ p_binfile->dwarf.i_abbrevs_max = 0;
}
memset( p_binfile, 0x00, sizeof( LibGoblin_BinaryFile ) );
LibGoblin_DwarfAbbrev_Read( p_bin, i_abbrevs );
*/
// Read .debug_abbrev section
- LibGoblin_DwarfInfo_Analyze( p_bin );
+// LibGoblin_DwarfInfo_Analyze( p_bin );
// Read .debug_line section
LibGoblin_DwarfLine_Analyze( p_bin );
{
int i_result;
- i_result = DWARF_Abbrev_Read( p_binfo );
+ i_result = DWARF_Abbrev_AllocMemory( p_binfo );
+ if( 0x00 != i_result ) {
+ return 0x01;
+ }
+
+ i_result = DWARF_Info_Read( p_binfo );
if( 0x00 != i_result ) {
return 0x01;
}
assert( NULL != p_bfile );
p_arvnow = p_bfile->dwarf.p_abbrev;
- for( i_cnt = 0; i_cnt < p_bfile->dwarf.i_abbrevs; i_cnt++, p_arvnow++ ) {
+ for( i_cnt = 0; i_cnt < p_bfile->dwarf.i_abbrevs_max; i_cnt++, p_arvnow++ ) {
printf(" [ID= %2d] TAG= %02xh Child=%s\n",
p_arvnow->dw_id, p_arvnow->dw_tag,
/*----------------------------------------------------------------------
----------------------------------------------------------------------*/
+LIBGOBLIN_DWARF_ABBREV_EXTERN
int
DWARF_Abbrev_ReadAbbrevEntry(
+ DWARF_AbbrevEntry **pp_abbrev,
+ int *pi_abbrevs,
LibGoblin_BinaryInfo *p_binfo,
- LibGoblin_BinaryFile *p_bfile )
+ LibGoblin_BinaryFile *p_bfile,
+ QWord qw_offset )
{
int i_abbrevs;
int i_items;
+ int i_count;
Byte *pb_data;
Byte b_children;
QWord qw_temp;
QWord qw_remain;
DWord dw_abbrev_num;
+ DWord dw_before_num;
DWord dw_tag;
DWord dw_attribute;
DWord dw_format;
LibGoblin_SectionInfo *psec_abbrev;
DWARF_AbbrevEntry *p_arvnow;
+ assert( NULL != pp_abbrev );
+ assert( NULL != pi_abbrevs );
assert( NULL != p_binfo );
assert( NULL != p_bfile );
+ *pp_abbrev = NULL;
+ *pi_abbrevs = 0;
+
// Get .debug_abbrev section Info ---
psec_abbrev = Section_GetSectionInfo( p_binfo, LIBGOBLIN_SECTION_ID_DEBUG_ABBREV );
assert( NULL != psec_abbrev );
if( NULL == psec_abbrev->pb_data ) {
return 0x01;
}
- pb_data = psec_abbrev->pb_data;
- qw_remain = psec_abbrev->qw_size;
+ pb_data = psec_abbrev->pb_data + qw_offset;
+ qw_remain = p_bfile->dwarf.qw_abbrev_unreadsz;
- i_abbrevs = p_bfile->dwarf.i_abbrevs;
- p_arvnow = p_bfile->dwarf.p_abbrev;
+ i_abbrevs = p_bfile->dwarf.i_abbrevs_max;
+ p_arvnow = p_bfile->dwarf.p_abbrev + i_abbrevs;
+ i_count = 0;
+ dw_before_num = 0;
do {
// Read Abbrev Number ---
pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_remain );
pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_remain );
dw_tag = (DWord)qw_temp;
+ if(( 0x00 == dw_tag ) || (dw_abbrev_num < dw_before_num )) { break; }
+
/* Read IsChildren */
b_children = *pb_data++;
qw_remain--;
- p_arvnow->dw_id = dw_abbrev_num;
- p_arvnow->dw_tag = dw_tag;
- p_arvnow->b_children = b_children;
-
i_items = -1;
do {
i_items++;
}while((0x00 != dw_attribute) && (0x00 != dw_format) && (qw_remain > 0) );
- p_arvnow->i_items = i_items;
- p_arvnow++;
-
- /* Skip Byte for Next Compile-Unit Abbrev. */
+ // Skip Byte for Abbrev
if( 0x00 == *pb_data ) {
pb_data++;
qw_remain--;
}
+ p_arvnow->dw_id = dw_abbrev_num;
+ p_arvnow->dw_tag = dw_tag;
+ p_arvnow->b_children = b_children;
+ p_arvnow->i_items = i_items;
+ p_arvnow++;
+ p_bfile->dwarf.i_abbrevs_max++;
+ p_bfile->dwarf.qw_abbrev_unreadsz = qw_remain;
+ dw_before_num = dw_abbrev_num;
+ i_count++;
+
}while((qw_remain > 0) && (dw_tag != 0x00));
+ *pp_abbrev = p_bfile->dwarf.p_abbrev + i_abbrevs;
+ *pi_abbrevs = i_count;
+
return 0x00;
}
DWARF_Abbrev_GetItems(
int *pi_filenum,
int *pi_abbrevs,
+ QWord *pqw_size,
LibGoblin_BinaryInfo *p_binfo )
{
Byte *pb_data;
if( NULL == psec_abbrev->pb_data ) {
return 0x01;
}
- pb_data = psec_abbrev->pb_data;
- qw_size = psec_abbrev->qw_size;
+ pb_data = psec_abbrev->pb_data;
+ qw_size = psec_abbrev->qw_size;
+ *pqw_size = psec_abbrev->qw_size;
*pi_filenum = 0;
*pi_abbrevs = 0;
----------------------------------------------------------------------*/
LIBGOBLIN_DWARF_ABBREV_EXTERN
int
- DWARF_Abbrev_Read(
+ DWARF_Abbrev_AllocMemory(
LibGoblin_BinaryInfo *p_binfo )
{
int i_result;
int i_filenums = 0;
int i_abbrevs = 0;
+ QWord qw_size;
DWARF_AbbrevEntry *p_abbrev;
LibGoblin_BinaryFile *p_bfile;
assert( NULL != p_bfile );
// Count Abbrevs ---
- i_result = DWARF_Abbrev_GetItems( &i_filenums, &i_abbrevs, p_binfo );
+ i_result = DWARF_Abbrev_GetItems( &i_filenums, &i_abbrevs, &qw_size, p_binfo );
if( 0x00 != i_result ) {
return 0x01;
}
if( NULL == p_abbrev ) {
return 0x02;
}
- p_bfile->dwarf.p_abbrev = p_abbrev;
- p_bfile->dwarf.i_abbrevs = i_abbrevs;
+ p_bfile->dwarf.p_abbrev = p_abbrev;
+ p_bfile->dwarf.i_abbrevs_alloc = i_abbrevs;
+ p_bfile->dwarf.i_abbrevs_max = 0;
+ p_bfile->dwarf.qw_abbrev_unreadsz = qw_size;
- // Read Abbrev ---
- i_result = DWARF_Abbrev_ReadAbbrevEntry( p_binfo, p_bfile );
- if( 0x00 != i_result ) {
- return 0x01;
- }
+ p_bfile->dwarf.i_srcfiles = i_filenums;
return 0x00;
}
void Debug_DWARF_Abbrev_Dump( LibGoblin_BinaryInfo *p_binfo, Byte b_level );
LIBGOBLIN_DWARF_ABBREV_EXTERN
- int DWARF_Abbrev_Read( LibGoblin_BinaryInfo *p_binfo );
+ int DWARF_Abbrev_ReadAbbrevEntry(
+ DWARF_AbbrevEntry **pp_abbrev, int *pi_abbrevs,
+ LibGoblin_BinaryInfo *p_binfo, LibGoblin_BinaryFile *p_bfile, QWord qw_offset );
+LIBGOBLIN_DWARF_ABBREV_EXTERN
+ int DWARF_Abbrev_AllocMemory( LibGoblin_BinaryInfo *p_binfo );
// old ---
/*----------------------------------------------------------------------
----------------------------------------------------------------------*/
+/*
LIBGOBLIN_DWARF_COMMON_EXTERN
Byte *
LibGoblin_DwarfCommon_Read_CUHeader(
i_readbytes = 0;
i_bitflag = 32;
- /* Read unit_length (4Byte + 8Byte(64bit)) */
+ // Read unit_length (4Byte + 8Byte(64bit))
pb_data = LibGoblin_DwarfCommon_Read_DWord(
&dw_dword, pb_data, &qw_size_info );
if( NULL == pb_data ) { return NULL; }
p_cuhead->b_bits = 32;
}
- /* Read version (2Byte) */
+ // Read version (2Byte)
pb_data = LibGoblin_DwarfCommon_Read_Word(
&(p_cuhead->w_version), pb_data, &qw_size_info );
if( NULL == pb_data ) { return NULL; }
i_readbytes = 2;
- /* Read abbrev_offset (4Byte(32bit), 8Byte(64bit)) */
+ // Read abbrev_offset (4Byte(32bit), 8Byte(64bit))
if( 64 == i_bitflag ) {
pb_data = LibGoblin_DwarfCommon_Read_QWord(
&qw_qword, pb_data, &qw_size_info );
p_cuhead->qw_abbrev_offset = (QWord)dw_dword;
}
- /* Read address_size (1Byte) */
+ // Read address_size (1Byte)
pb_data = LibGoblin_DwarfCommon_Read_Byte(
&(p_cuhead->b_pointersize), pb_data, &qw_size_info);
if( NULL == pb_data ) { return NULL; }
return pb_data;
}
-
+*/
/*----------------------------------------------------------------------
----------------------------------------------------------------------*/
LibGoblin_Dwarf_AbbrevEntry t_abbentry;
//printf(" pnt: %p ", pb_src);
- /* Read Reference Abbrev-ID */
+ // Read Reference Abbrev-ID
pb_src = DWARF_Common_DecodeULEB128(
&qw_temp, pb_src, pqw_remains );
dw_abbrev = (DWord)qw_temp;
if( 0x00000000 == dw_abbrev ) { return pb_src; }
- /* Set Reference Abbrev */
+ // Set Reference Abbrev
p_abbrev = (pt_srcfile->p_abbrev_info) + (dw_abbrev - 1 );
if( NULL == p_abbrev ) { return NULL; }
p_die->dw_format[ i_cnt ] = dw_format;
switch( dw_format ) {
- case DW_FORM_addr: /* 0x01: address */
+ case DW_FORM_addr: // 0x01: address
pb_src = LibGoblin_DwarfInfo_ReadFormat_Address(
&(p_die->t_value[i_cnt]), pb_src, pqw_remains,
&b_type, (int)(p_cuheader->b_pointersize) );
break;
- case DW_FORM_block2: /* 0x03: block */
+ case DW_FORM_block2: // 0x03: block
pb_src = LibGoblin_DwarfInfo_ReadFormat_Block(
&(p_die->t_value[i_cnt]),
pb_src, pqw_remains, &b_type, 2);
break;
- case DW_FORM_block4: /* 0x04: block */
+ case DW_FORM_block4: // 0x04: block
pb_src = LibGoblin_DwarfInfo_ReadFormat_Block(
&(p_die->t_value[i_cnt]),
pb_src, pqw_remains, &b_type, 4);
break;
- case DW_FORM_data2: /* 0x05: const. */
+ case DW_FORM_data2: // 0x05: const.
pb_src = LibGoblin_DwarfCommon_Read_Word(
&(p_die->t_value[i_cnt].w_value),
pb_src, pqw_remains );
b_type = LIBGOBLIN_DWARF_INFO_TYPE_WORD;
break;
- case DW_FORM_data4: /* 0x06: const. line/loc/mac/rng-ptr */
+ case DW_FORM_data4: // 0x06: const. line/loc/mac/rng-ptr
pb_src = LibGoblin_DwarfCommon_Read_DWord(
&(p_die->t_value[i_cnt].dw_value),
pb_src, pqw_remains );
b_type = LIBGOBLIN_DWARF_INFO_TYPE_DWORD;
break;
- case DW_FORM_data8: /* 0x07: const. line/loc/mac/rng-ptr */
+ case DW_FORM_data8: // 0x07: const. line/loc/mac/rng-ptr
pb_src = LibGoblin_DwarfCommon_Read_QWord(
&(p_die->t_value[i_cnt].qw_value),
pb_src, pqw_remains );
b_type = LIBGOBLIN_DWARF_INFO_TYPE_QWORD;
break;
- case DW_FORM_string: /* 0x08: string */
+ case DW_FORM_string: // 0x08: string
pb_src = LibGoblin_DwarfInfo_ReadFormat_String(
&(p_die->t_value[i_cnt]),
pb_src, pqw_remains, &b_type);
break;
- case DW_FORM_block: /* 0x09: block */
+ case DW_FORM_block: // 0x09: block
pb_src = LibGoblin_DwarfInfo_ReadFormat_Block(
&(p_die->t_value[i_cnt]),
pb_src, pqw_remains, &b_type, -1);
break;
- case DW_FORM_block1: /* 0x0a: block */
+ case DW_FORM_block1: // 0x0a: block
pb_src = LibGoblin_DwarfInfo_ReadFormat_Block(
&(p_die->t_value[i_cnt]),
pb_src, pqw_remains, &b_type, 1);
break;
- case DW_FORM_data1: /* 0x0b: const. */
+ case DW_FORM_data1: // 0x0b: const.
pb_src = LibGoblin_DwarfCommon_Read_Byte(
&(p_die->t_value[i_cnt].b_value),
pb_src, pqw_remains );
b_type = LIBGOBLIN_DWARF_INFO_TYPE_BYTE;
break;
- case DW_FORM_flag: /* 0x0c: flag */
+ case DW_FORM_flag: // 0x0c: flag
pb_src = LibGoblin_DwarfCommon_Read_Byte(
&(p_die->t_value[i_cnt].b_value),
pb_src, pqw_remains );
b_type = LIBGOBLIN_DWARF_INFO_TYPE_BYTE;
break;
- case DW_FORM_sdata: /* 0x0d: sdata */
+ case DW_FORM_sdata: // 0x0d: sdata
pb_src = DWARF_Common_DecodeLEB128(
&(p_die->t_value[i_cnt].ii_value),
pb_src, pqw_remains );
b_type = LIBGOBLIN_DWARF_INFO_TYPE_INT64;
break;
- case DW_FORM_strp: /* 0x0e: string */
+ case DW_FORM_strp: // 0x0e: string
pb_src = LibGoblin_DwarfInfo_ReadFormat_Strp(
&(p_die->t_value[i_cnt]),
pb_src, pqw_remains, &b_type,
p_cuheader->b_bits );
// XXX reference for .debug_str
break;
- case DW_FORM_udata: /* 0x0f: const. */
+ case DW_FORM_udata: // 0x0f: const.
pb_src = DWARF_Common_DecodeULEB128(
&(p_die->t_value[i_cnt].qw_value),
pb_src, pqw_remains );
b_type = LIBGOBLIN_DWARF_INFO_TYPE_QWORD;
break;
- case DW_FORM_ref_addr: /* 0x10: ref. */
+ case DW_FORM_ref_addr: // 0x10: ref.
pb_src = LibGoblin_DwarfInfo_ReadFormat_Address(
&(p_die->t_value[i_cnt]),pb_src, pqw_remains,
&b_type, (int)(p_cuheader->b_pointersize) );
break;
- case DW_FORM_ref1: /* 0x11: ref. */
+ case DW_FORM_ref1: // 0x11: ref.
pb_src = LibGoblin_DwarfInfo_ReadFormat_Ref_inCU(
&(p_die->t_value[i_cnt]),
pb_src, pqw_remains, &b_type, 1,
pt_srcfile->t_infosec.pb_pos );
break;
- case DW_FORM_ref2: /* 0x12: ref. */
+ case DW_FORM_ref2: // 0x12: ref.
pb_src = LibGoblin_DwarfInfo_ReadFormat_Ref_inCU(
&(p_die->t_value[i_cnt]),
pb_src, pqw_remains, &b_type, 2,
pt_srcfile->t_infosec.pb_pos );
break;
- case DW_FORM_ref4: /* 0x13: ref. */
+ case DW_FORM_ref4: // 0x13: ref.
pb_src = LibGoblin_DwarfInfo_ReadFormat_Ref_inCU(
&(p_die->t_value[i_cnt]),
pb_src, pqw_remains, &b_type, 4,
pt_srcfile->t_infosec.pb_pos );
break;
- case DW_FORM_ref8: /* 0x14: ref. */
+ case DW_FORM_ref8: // 0x14: ref.
pb_src = LibGoblin_DwarfInfo_ReadFormat_Ref_inCU(
&(p_die->t_value[i_cnt]),
pb_src, pqw_remains, &b_type, 8,
pt_srcfile->t_infosec.pb_pos );
break;
- case DW_FORM_ref_udata: /* 0x15: ref. */
+ case DW_FORM_ref_udata: // 0x15: ref.
pb_src = LibGoblin_DwarfInfo_ReadFormat_Ref_inCU(
&(p_die->t_value[i_cnt]),
pb_src, pqw_remains, &b_type, -1,
pt_srcfile->t_infosec.pb_pos );
break;
- case DW_FORM_indirect: /* 0x16: ref. */
+ case DW_FORM_indirect: // 0x16: ref.
puts("a");
break;
default:
/*----------------------------------------------------------------------
----------------------------------------------------------------------*/
Byte *
- LibGoblin_DwarfInfo_ReadCompileUnit(
- LibGoblin_Dwarf_SourceFile *p_src,
- Byte *pb_data,
+ DWARF_Info_ReadCUHeader(
+ LibGoblin_DwarfCommon_CUHeader *p_cuhead,
+ Byte *pb_info,
QWord *pqw_size_info )
{
- QWord qw_unitsize;
- LibGoblin_DwarfCommon_CUHeader t_cuheader;
- LibGoblin_Dwarf_DIE t_die;
-
- assert( NULL != p_src );
- assert( NULL != pb_data );
-
- if( 0 == *pqw_size_info ) { return NULL; }
-
- /* Read Compile Unit Header */
- pb_data = LibGoblin_DwarfCommon_Read_CUHeader(
- &t_cuheader, pb_data, *pqw_size_info);
- if( NULL == pb_data ) { return NULL; }
-
- qw_unitsize = t_cuheader.qw_unitsize;
+ int i_bitflag;
+ int i_readbytes;
+ DWord dw_dword;
+ QWord qw_qword;
+
+ assert( NULL != p_cuhead );
+ assert( NULL != pb_info );
+
+ i_readbytes = 0;
+ i_bitflag = 32;
+
+ // Read unit_length (4Byte + 8Byte(64bit)) ---
+ pb_info = LibGoblin_DwarfCommon_Read_DWord(
+ &dw_dword, pb_info, pqw_size_info );
+ if( NULL == pb_info ) { return NULL; }
+
+ // 64bit - First 4Byte = 0xffffffff
+ if( ((DWord)0xffffffff) == dw_dword ) {
+ pb_info = LibGoblin_DwarfCommon_Read_QWord(
+ &qw_qword, pb_info, pqw_size_info );
+ if( NULL == pb_info ) { return NULL; }
+
+ p_cuhead->qw_unitsize = (QWord)qw_qword;
+ i_bitflag = 64;
+ p_cuhead->b_bits = 64;
+ }
+ // 32bit - First 4Byte = value.
+ else {
+ p_cuhead->qw_unitsize = (QWord)dw_dword;
+ p_cuhead->b_bits = 32;
+ }
-/* printf( "size: %ld, ver:%d, abbrev off.:%ld, addr.size: %d\n",
- t_cuheader.qw_unitsize,
- t_cuheader.w_version,
- t_cuheader.qw_abbrev_offset,
- t_cuheader.b_pointersize); */
+ // Read version (2Byte) ---
+ pb_info = LibGoblin_DwarfCommon_Read_Word(
+ &(p_cuhead->w_version), pb_info, pqw_size_info );
+ if( NULL == pb_info ) { return NULL; }
+ i_readbytes = 2;
- do {
- /* Read Debug Information Entry (DIE */
- pb_data = LibGoblin_DwarfInfo_ReadDIE(
- &t_die, pb_data, &qw_unitsize, p_src, &t_cuheader );
+ // Read abbrev_offset (4Byte(32bit), 8Byte(64bit)) ---
+ if( 64 == i_bitflag ) {
+ pb_info = LibGoblin_DwarfCommon_Read_QWord(
+ &qw_qword, pb_info, pqw_size_info );
+ if( NULL == pb_info ) { return NULL; }
+ i_readbytes += 8;
- /* Dispatch for generate Rapid-Access Table by DIE-tag */
+ p_cuhead->qw_abbrev_offset = qw_qword;
+ }
+ else {
+ pb_info = LibGoblin_DwarfCommon_Read_DWord(
+ &dw_dword, pb_info, pqw_size_info );
+ if( NULL == pb_info ) { return NULL; }
+ i_readbytes += 4;
- }while( 0 != qw_unitsize );
+ p_cuhead->qw_abbrev_offset = (QWord)dw_dword;
+ }
- puts( "OKOK");
- *pqw_size_info -= t_cuheader.qw_unitsize;
+ // Read address_size (1Byte) ---
+ pb_info = LibGoblin_DwarfCommon_Read_Byte(
+ &(p_cuhead->b_pointersize), pb_info, pqw_size_info);
+ if( NULL == pb_info ) { return NULL; }
+ i_readbytes += 1;
- return pb_data;
+ p_cuhead->qw_unitsize -= i_readbytes;
+
+ return pb_info;
}
----------------------------------------------------------------------*/
LIBGOBLIN_DWARF_INFO_EXTERN
int
- LibGoblin_DwarfInfo_Analyze(
- LibGoblin_BinaryInfo *p_bin )
+ DWARF_Info_Read(
+ LibGoblin_BinaryInfo *p_binfo )
{
- int i_srcfiles;
- Byte *pb_data;
- QWord qw_size_info;
- LibGoblin_Dwarf_SourceFile *p_src;
- LibGoblin_Debug_Dwarf *p_dwarf;
+ int i_result;
+ int i_srcfiles;
+ Byte *pb_info;
+ Byte *pb_abbrev;
+ DWord dw_arvid;
+ QWord qw_temp;
+ QWord qw_size_cu;
+ QWord qw_size_info;
+ LibGoblin_SectionInfo *psec_info;
+ LibGoblin_SectionInfo *psec_abbrev;
+ LibGoblin_BinaryFile *p_bfile;
+ LibGoblin_DwarfCommon_CUHeader t_cuheader;
+ LibGoblin_Dwarf_DIE t_die;
+ DWARF_AbbrevEntry *p_abbrev;
+ DWARF_AbbrevEntry *p_arvnow;
+ int i_abbrevs;
- assert( NULL != p_bin );
+ assert( NULL != p_binfo );
- p_dwarf = (LibGoblin_Debug_Dwarf *)p_bin->p_debug;
- assert( NULL != p_dwarf );
+ p_bfile = BinaryFile_GetBinaryFile( p_binfo->i_binfile );
+ assert( NULL != p_bfile );
+
+ i_srcfiles = p_bfile->dwarf.i_srcfiles;
+
+ // Get section Info ---
+ psec_info = Section_GetSectionInfo( p_binfo, LIBGOBLIN_SECTION_ID_DEBUG_INFO );
+ assert( NULL != psec_info );
+ if( NULL == psec_info->pb_data ) {
+ return 0x01;
+ }
+ pb_info = psec_info->pb_data;
+ qw_size_info = psec_info->qw_size;
+
+ //do {
+ // Read Compile Unit Header ---
+ pb_info = DWARF_Info_ReadCUHeader( &t_cuheader, pb_info, &qw_size_info );
+ if( NULL == pb_info ) { return NULL; }
+
+ qw_size_cu = t_cuheader.qw_unitsize;
+
+/*
+ printf( "size: %ld, ver:%d, abbrev off.:%ld, addr.size: %d\n",
+ t_cuheader.qw_unitsize,
+ t_cuheader.w_version,
+ t_cuheader.qw_abbrev_offset,
+ t_cuheader.b_pointersize);
+*/
- i_srcfiles = p_dwarf->i_srcfilenum;
+ // Read Abbrev ---
+ i_result = DWARF_Abbrev_ReadAbbrevEntry(
+ &p_abbrev, &i_abbrevs,
+ p_binfo, p_bfile, t_cuheader.qw_abbrev_offset );
- p_src = p_dwarf->p_src;
- assert( NULL != p_src );
+ do {
+ // Read Reference Abbrev-ID ---
+ pb_info = DWARF_Common_DecodeULEB128( &qw_temp, pb_info, &qw_size_cu );
+ dw_arvid = (DWord)qw_temp;
+ //assert( 0 < dw_arvid );
+ p_arvnow = p_abbrev + (dw_arvid - 1);
- /* Get .debug_abbrev section Info */
- pb_data = ELF_GetSection(
- &qw_size_info, p_bin,
- LIBGOBLIN_SECTION_ID_DEBUG_INFO );
- if( NULL == pb_data ) { return 0x01; }
- do {
- p_src->t_infosec.pb_pos = pb_data;
+ // Read Debug Information Entry (DIE)
+ //pb_data = LibGoblin_DwarfInfo_ReadDIE( &t_die, pb_data, &qw_size_cu, p_src, &t_cuheader );
- /* Analyze .debug_info compile unit */
- pb_data = LibGoblin_DwarfInfo_ReadCompileUnit(
- p_src, pb_data, &qw_size_info );
- if( NULL == pb_data) { return 0x02; }
+ // Dispatch for generate Rapid-Access Table by DIE-tag
- p_src++;
- i_srcfiles--;
+ }while( 0 != qw_size_cu );
+ qw_size_info -= t_cuheader.qw_unitsize;
- }while((qw_size_info > 0) && (i_srcfiles > 0));
+ //}while((qw_size_info > 0) && (i_srcfiles > 0));
return 0x00;
}
Byte *pb_pos;
} LibGoblin_Dwarf_InfoSection;
-
+/*
LIBGOBLIN_DWARF_INFO_EXTERN
int
LibGoblin_DwarfInfo_Analyze(
LibGoblin_BinaryInfo *p_bin );
+*/
+
+LIBGOBLIN_DWARF_INFO_EXTERN
+ int DWARF_Info_Read( LibGoblin_BinaryInfo *p_binfo );
#endif /* DRD64_HEADER_LIBGOBLIN_BINFO */
--- /dev/null
+/*DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64
+
+ D r . D e a m o n 6 4
+ for INTEL64(R), AMD64(R)
+
+ Copyright(C) 2007-2009 Koine Yuusuke(koinec). All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY Koine Yuusuke(koinec) ``AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL Koine Yuusuke(koinec) OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+OF THE POSSIBILITY OF SUCH DAMAGE.
+
+DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64*/
+
+/* File Info -----------------------------------------------------------
+File: drd64_.c
+Function:
+Comment:
+----------------------------------------------------------------------*/
+
+#define DRD64_SRC_LIBGOBLIN_DWARF_TAG
+#include"drd64_libgoblin.h"
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+
+
+
+/* EOF of drd64_.c ----------------------------------- */
--- /dev/null
+/*DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64
+
+ D r . D e a m o n 6 4
+ for INTEL64(R), AMD64(R)
+
+ Copyright(C) 2007-2009 Koine Yuusuke(koinec). All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY Koine Yuusuke(koinec) ``AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL Koine Yuusuke(koinec) OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+OF THE POSSIBILITY OF SUCH DAMAGE.
+
+DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64*/
+
+/* File Info -----------------------------------------------------------
+File: drd64_.h
+Function: Header
+Comment:
+----------------------------------------------------------------------*/
+
+#ifndef DRD64_HEADER_LIBGOBLIN_DWARF_TAG
+#define DRD64_HEADER_LIBGOBLIN_DWARF_TAG
+
+#include"drd64_libgoblin.h"
+
+#ifdef DRD64_SRC_LIBGOBLIN_DWARF_TAG
+ #define LIBGOBLIN_DWARF_TAG_EXTERN
+#else
+ #define LIBGOBLIN_DWARF_TAG_EXTERN extern
+#endif
+
+#define LIBGOBLIN_DWARF_TAG_MAX 128
+#define LIBGOBLIN_DWARF_TAG_DEFAULT_MAX 0x43
+
+typedef struct {
+ DWord dw_tag;
+ int (* DWARF_Tag_Proc)( LibGoblin_BinaryInfo *p_binfo );
+} DWARF_TagFunction;
+
+#ifdef DRD64_SRC_LIBGOBLIN_DWARF_TAG
+DWARF_TagFunction dwarf_tag[LIBGOBLIN_DWARF_TAG_MAX] = {
+ { DW_TAG_array_type, NULL }, // 0x01
+ { DW_TAG_class_type, NULL }, // 0x02
+ { DW_TAG_entry_point, NULL }, // 0x03
+ { DW_TAG_enumeration_type, NULL }, // 0x04
+ { DW_TAG_formal_parameter, NULL }, // 0x05
+ { DW_TAG_imported_declaration, NULL }, // 0x08
+ { DW_TAG_label, NULL }, // 0x0a
+ { DW_TAG_lexical_block, NULL }, // 0x0b
+ { DW_TAG_member, NULL }, // 0x0d
+ { DW_TAG_pointer_type, NULL }, // 0x0f
+ { DW_TAG_reference_type, NULL }, // 0x10
+ { DW_TAG_compile_unit, NULL }, // 0x11
+ { DW_TAG_string_type, NULL }, // 0x12
+ { DW_TAG_structure_type, NULL }, // 0x13
+ { DW_TAG_subroutine_type, NULL }, // 0x15
+ { DW_TAG_typedef, NULL }, // 0x16
+ { DW_TAG_union_type, NULL }, // 0x17
+ { DW_TAG_unspecified_parameters, NULL }, // 0x18
+ { DW_TAG_variant, NULL }, // 0x19
+ { DW_TAG_common_block, NULL }, // 0x1a
+ { DW_TAG_common_inclusion, NULL }, // 0x1b
+ { DW_TAG_inheritance, NULL }, // 0x1c
+ { DW_TAG_inlined_subroutine, NULL }, // 0x1d
+ { DW_TAG_module, NULL }, // 0x1e
+ { DW_TAG_ptr_to_member_type, NULL }, // 0x1f
+ { DW_TAG_set_type, NULL }, // 0x20
+ { DW_TAG_subrange_type, NULL }, // 0x21
+ { DW_TAG_with_stmt, NULL }, // 0x22
+ { DW_TAG_access_declaration, NULL }, // 0x23
+ { DW_TAG_base_type, NULL }, // 0x24
+ { DW_TAG_catch_block, NULL }, // 0x25
+ { DW_TAG_const_type, NULL }, // 0x26
+ { DW_TAG_constant, NULL }, // 0x27
+ { DW_TAG_enumerator, NULL }, // 0x28
+ { DW_TAG_friend, NULL }, // 0x2a
+ { DW_TAG_namelist, NULL }, // 0x2b
+ { DW_TAG_namelist_item, NULL }, // 0x2c
+ { DW_TAG_packed_type, NULL }, // 0x2d
+ { DW_TAG_subprogram, NULL }, // 0x2e
+ { DW_TAG_template_type_parameter, NULL }, // 0x2f
+ { DW_TAG_template_type_param, NULL }, // 0x2f
+ { DW_TAG_template_value_parameter, NULL }, // 0x30
+ { DW_TAG_template_value_param, NULL }, // 0x30
+ { DW_TAG_thrown_type, NULL }, // 0x31
+ { DW_TAG_try_block, NULL }, // 0x32
+ { DW_TAG_variant_part, NULL }, // 0x33
+ { DW_TAG_variable, NULL }, // 0x34
+ { DW_TAG_volatile_type, NULL }, // 0x35
+ { DW_TAG_dwarf_procedure, NULL }, // 0x36
+ { DW_TAG_restrict_type, NULL }, // 0x37
+ { DW_TAG_interface_type, NULL }, // 0x38
+ { DW_TAG_namespace, NULL }, // 0x39
+ { DW_TAG_imported_module, NULL }, // 0x3a
+ { DW_TAG_unspecified_type, NULL }, // 0x3b
+ { DW_TAG_partial_unit, NULL }, // 0x3c
+ { DW_TAG_imported_unit, NULL }, // 0x3d
+ { DW_TAG_condition, NULL }, // 0x3f
+ { DW_TAG_shared_type, NULL }, // 0x40
+ { DW_TAG_type_unit, NULL }, // 0x41
+ { DW_TAG_rvalue_reference_type, NULL }, // 0x42
+ { DW_TAG_template_alias, NULL }, // 0x43
+ // DW_TAG_lo_user 0x4080 ----
+ { DW_TAG_format_label, NULL }, // 0x4101
+ { DW_TAG_function_template, NULL }, // 0x4102
+ { DW_TAG_class_template, NULL }, // 0x4103
+ { DW_TAG_GNU_BINCL, NULL }, // 0x4104
+ { DW_TAG_GNU_EINCL, NULL }, // 0x4105
+ { DW_TAG_GNU_template_template_parameter, NULL }, // 0x4106
+ { DW_TAG_GNU_template_template_param, NULL }, // 0x4106
+ { DW_TAG_GNU_template_parameter_pack, NULL }, // 0x4107
+ { DW_TAG_GNU_formal_parameter_pack, NULL }, // 0x4108
+ { DW_TAG_GNU_call_site, NULL }, // 0x4109
+ { DW_TAG_GNU_call_site_parameter, NULL } // 0x410a
+ // DW_TAG_hi_user 0xffff ----
+};
+#else
+extern DWARF_TagFunction dwarf_tag[LIBGOBLIN_DWARF_TAG_MAX];
+#endif
+
+#endif /* DRD64_HEADER_LIBGOBLIN_BINFO */
+
+/* EOF of drd64_.h ----------------------------------- */
goto_SrcFile_AllocSrcFile_dataset:
if( i_id_now == p_bfile->srcfile.i_max ) { p_bfile->srcfile.i_max++; }
- p_srcfile = SRCFILE( p_bfile, i_id_now );
- p_srcfile->i_id = i_id_now;
+ p_srcfile = SRCFILE( p_bfile, i_id_now );
+ p_srcfile->i_id = i_id_now;
+ p_srcfile->i_bfile_id = p_bfile->i_id;
p_bfile->srcfile.i_now++;
goto_SrcFile_AllocSrcFile_post:
memset( p_srcfile, 0x00, sizeof( LibGoblin_SrcFile ) );
- p_srcfile->i_id = -0x01;
+ p_srcfile->i_id = -0x01;
+ p_srcfile->i_bfile_id = -0x01;
return;
}
char str_filename[DRD64_MAX_PATH];
char str_localpath[DRD64_MAX_PATH];
char str_remotepath[DRD64_MAX_PATH];
+
+ int i_bfile_id;
+ struct {
+ int i_abbrevs;
+ DWARF_AbbrevEntry *p_abbrev;
+ } dwarf;
+
} LibGoblin_SrcFile;
} srcfile;
struct {
- int i_abbrevs;
+ int i_abbrevs_max;
+ int i_abbrevs_alloc;
DWARF_AbbrevEntry *p_abbrev;
+ QWord qw_abbrev_unreadsz;
+
+ int i_srcfiles;
} dwarf;