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,
memset( p_entry, 0x00, sizeof( LibGoblin_Dwarf_AbbrevEntry ) );
/* Read Abbrev Number */
- pb_src = LibGoblin_DwarfCommon_Decode_ULEB128(
- &qw_temp, pb_src, pqw_remain );
+ pb_src = DWARF_Common_DecodeULEB128( &qw_temp, pb_src, pqw_remain );
p_entry->dw_id = (DWord)qw_temp;
if( 0x00000000 == p_entry->dw_id ) {
}
/* Read TAG */
- pb_src = LibGoblin_DwarfCommon_Decode_ULEB128(
- &qw_temp, pb_src, pqw_remain );
+ pb_src = DWARF_Common_DecodeULEB128( &qw_temp, pb_src, pqw_remain );
p_entry->dw_tag = (DWord)qw_temp;
/* Read IsChildren */
- pb_src = LibGoblin_DwarfCommon_Read_Byte(
- &(p_entry->b_children), pb_src, pqw_remain );
+ pb_src = DWARF_Common_Read_Byte( &(p_entry->b_children), pb_src, pqw_remain );
if( NULL == pb_src ) { return NULL; }
/*
do {
/* Read Attribute */
- pb_src = LibGoblin_DwarfCommon_Decode_ULEB128(
- &qw_temp, pb_src, pqw_remain );
+ pb_src = DWARF_Common_DecodeULEB128( &qw_temp, pb_src, pqw_remain );
dw_attribute = (DWord)qw_temp;
p_entry->dw_attribute[i_items] = dw_attribute;
/* Read Format */
- pb_src = LibGoblin_DwarfCommon_Decode_ULEB128(
- &qw_temp, pb_src, pqw_remain );
+ pb_src = DWARF_Common_DecodeULEB128( &qw_temp, pb_src, pqw_remain );
dw_format = (DWord)qw_temp;
p_entry->dw_format[i_items] = dw_format;
/*----------------------------------------------------------------------
----------------------------------------------------------------------*/
+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 = LibGoblin_DwarfCommon_Decode_ULEB128(
- &qw_temp, pb_data, &qw_remain );
+ pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_remain );
dw_abbrev_num = (DWord)qw_temp;
/* Read TAG */
- pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
- &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++;
/* Read Attribute */
- pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
- &qw_temp, pb_data, &qw_remain );
+ pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_remain );
dw_attribute = (DWord)qw_temp;
/* Read Format */
- pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
- &qw_temp, pb_data, &qw_remain );
+ pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_remain );
dw_format = (DWord)qw_temp;
p_arvnow->dw_attribute[ i_items ] = dw_attribute;
}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,
+ int *pi_maxitems,
+ QWord *pqw_size,
LibGoblin_BinaryInfo *p_binfo )
{
+ int i_maxitems;
+ int i_items;
Byte *pb_data;
Byte b_children;
QWord qw_temp;
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;
+ i_maxitems = 0;
do {
(*pi_abbrevs)++;
/* Read Abbrev Number */
- pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
- &qw_temp, pb_data, &qw_size );
+ pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_size );
dw_abbrev_num = (DWord)qw_temp;
/* Read TAG */
- pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
- &qw_temp, pb_data, &qw_size );
+ pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_size );
dw_tag = (DWord)qw_temp;
if( DW_TAG_compile_unit == dw_tag ) {
(*pi_filenum)++;
b_children = *pb_data++;
qw_size--;
+ i_items = -1;
do {
+ i_items++;
/* Read Attribute */
- pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
- &qw_temp, pb_data, &qw_size );
+ pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_size );
dw_attribute = (DWord)qw_temp;
/* Read Format */
- pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
- &qw_temp, pb_data, &qw_size );
+ pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_size );
dw_format = (DWord)qw_temp;
- }while((0x00 != dw_attribute) && (0x00 != dw_format)
- && (qw_size > 0) );
+ }while((0x00 != dw_attribute) && (0x00 != dw_format) && (qw_size > 0) );
+
+ if( i_maxitems < i_items ) { i_maxitems = i_items; }
/* Skip Byte for Next Compile-Unit Abbrev. */
if( 0x00 == *pb_data ) {
}
}while((qw_size > 0) && (dw_tag != 0x00));
+
+ *pi_maxitems = i_maxitems;
return 0x00;
}
----------------------------------------------------------------------*/
LIBGOBLIN_DWARF_ABBREV_EXTERN
int
- DWARF_Abbrev_Read(
+ DWARF_Abbrev_AllocMemory(
LibGoblin_BinaryInfo *p_binfo )
{
int i_result;
+ int i_maxitems = 0;
int i_filenums = 0;
int i_abbrevs = 0;
+ QWord qw_size;
DWARF_AbbrevEntry *p_abbrev;
+ LibGoblin_DWARF_DIEValue *p_dievalue;
LibGoblin_BinaryFile *p_bfile;
p_bfile = BinaryFile_GetBinaryFile( p_binfo->i_binfile );
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, &i_maxitems, &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_objfiles = i_filenums;
+
+ // Alloc Abbrev Memory ---
+ p_dievalue = (LibGoblin_DWARF_DIEValue *)malloc(
+ sizeof( LibGoblin_DWARF_DIEValue ) * i_maxitems );
+ if( NULL == p_dievalue ) {
+ return 0x03;
}
+ p_bfile->dwarf.i_maxvals = i_maxitems;
+
+ p_binfo->dwarf.i_maxvals = i_maxitems;
+ p_binfo->dwarf.p_infoval = p_dievalue;
return 0x00;
}