/*----------------------------------------------------------------------
----------------------------------------------------------------------*/
LIBGOBLIN_DWARF_ABBREV_EXTERN
+void
+ Debug_DWARF_Abbrev_Dump(
+ LibGoblin_BinaryInfo *p_binfo,
+ Byte b_level )
+{
+ int i_cnt;
+ int i_items;
+ LibGoblin_BinaryFile *p_bfile;
+ DWARF_AbbrevEntry *p_arvnow;
+
+ if( 0x00 < b_level )
+ { puts("[DEBUG] DWARF Abbrev ------------------------------------------------"); }
+
+ p_bfile = BinaryFile_GetBinaryFile( p_binfo->i_binfile );
+ 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++ ) {
+
+ printf(" [ID= %2d] TAG= %02xh Child=%s\n",
+ p_arvnow->dw_id, p_arvnow->dw_tag,
+ ((0x00 == p_arvnow->b_children) ? "NO" : "YES") );
+
+ for( i_items = 0; i_items < p_arvnow->i_items; i_items++ ) {
+ printf(" Attribute= %02xh , Format= %02xh\n",
+ p_arvnow->dw_attribute[ i_items ],
+ p_arvnow->dw_format[ i_items ] );
+ }
+ }
+
+ if( 0x00 < b_level ) {
+ puts("-----------------------------------------------------------------------");
+ puts("");
+ }
+
+ return;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+LIBGOBLIN_DWARF_ABBREV_EXTERN
Byte *
LibGoblin_DwarfAbbrev_ReadEntry(
LibGoblin_Dwarf_AbbrevEntry *p_entry,
/*----------------------------------------------------------------------
----------------------------------------------------------------------*/
int
- DWARF_Abbrev_GetItems(
- int *pi_filenum,
- int *pi_abbrevs,
- LibGoblin_BinaryInfo *p_binfo )
+ DWARF_Abbrev_ReadAbbrevEntry(
+ LibGoblin_BinaryInfo *p_binfo,
+ LibGoblin_BinaryFile *p_bfile )
{
+ int i_abbrevs;
+ int i_items;
Byte *pb_data;
Byte b_children;
QWord qw_temp;
- QWord qw_size_abbrev;
+ QWord qw_remain;
DWord dw_abbrev_num;
DWord dw_tag;
DWord dw_attribute;
DWord dw_format;
LibGoblin_SectionInfo *psec_abbrev;
+ DWARF_AbbrevEntry *p_arvnow;
assert( NULL != p_binfo );
+ assert( NULL != p_bfile );
// Get .debug_abbrev section Info ---
psec_abbrev = Section_GetSectionInfo( p_binfo, LIBGOBLIN_SECTION_ID_DEBUG_ABBREV );
if( NULL == psec_abbrev->pb_data ) {
return 0x01;
}
- pb_data = psec_abbrev->pb_data;
+ pb_data = psec_abbrev->pb_data;
+ qw_remain = psec_abbrev->qw_size;
- *pi_filenum = 0;
- *pi_abbrevs = 0;
+ i_abbrevs = p_bfile->dwarf.i_abbrevs;
+ p_arvnow = p_bfile->dwarf.p_abbrev;
do {
- (*pi_abbrevs)++;
-
- /* Read Abbrev Number */
+ // Read Abbrev Number ---
pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
- &qw_temp, pb_data, &qw_size_abbrev );
+ &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_size_abbrev );
+ &qw_temp, pb_data, &qw_remain );
dw_tag = (DWord)qw_temp;
- if( DW_TAG_compile_unit == dw_tag ) {
- (*pi_filenum)++;
- }
/* Read IsChildren */
b_children = *pb_data++;
- qw_size_abbrev--;
+ 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_size_abbrev );
+ &qw_temp, pb_data, &qw_remain );
dw_attribute = (DWord)qw_temp;
/* Read Format */
pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
- &qw_temp, pb_data, &qw_size_abbrev );
+ &qw_temp, pb_data, &qw_remain );
dw_format = (DWord)qw_temp;
- }while((0x00 != dw_attribute) && (0x00 != dw_format)
- && (qw_size_abbrev > 0) );
+ p_arvnow->dw_attribute[ i_items ] = dw_attribute;
+ p_arvnow->dw_format[ i_items ] = dw_format;
+
+ }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. */
if( 0x00 == *pb_data ) {
pb_data++;
- qw_size_abbrev--;
+ qw_remain--;
}
- }while((qw_size_abbrev > 0) && (dw_tag != 0x00));
+ }while((qw_remain > 0) && (dw_tag != 0x00));
return 0x00;
}
/*----------------------------------------------------------------------
----------------------------------------------------------------------*/
-LIBGOBLIN_DWARF_ABBREV_EXTERN
int
- LibGoblin_DwarfAbbrev_Read(
- LibGoblin_BinaryInfo *p_bin,
- int i_abbrevs )
+ DWARF_Abbrev_GetItems(
+ int *pi_filenum,
+ int *pi_abbrevs,
+ LibGoblin_BinaryInfo *p_binfo )
{
Byte *pb_data;
Byte b_children;
QWord qw_temp;
- QWord qw_size_abbrev;
- QWord qw_remain;
+ QWord qw_size;
DWord dw_abbrev_num;
DWord dw_tag;
DWord dw_attribute;
DWord dw_format;
- LibGoblin_Dwarf_AbbrevInfo *p_abbrev;
- LibGoblin_Dwarf_SourceFile *p_src;
- LibGoblin_Dwarf_SourceFile *p_nowsrc;
- LibGoblin_Debug_Dwarf *p_dwarf;
-
- assert( NULL != p_bin );
-
- p_dwarf = (LibGoblin_Debug_Dwarf *)p_bin->p_debug;
- assert( NULL != p_dwarf );
-
- p_src = p_dwarf->p_src;
- assert( NULL != p_src );
+ LibGoblin_SectionInfo *psec_abbrev;
- /* Get .debug_abbrev section Info */
- pb_data = ELF_GetSection(
- &qw_size_abbrev, p_bin,
- LIBGOBLIN_SECTION_ID_DEBUG_ABBREV );
- if( NULL == pb_data ) { return 0x01; }
+ assert( NULL != p_binfo );
- /* Alloc Abbrev Info. for debug_dwarf_info struct */
- p_abbrev = (LibGoblin_Dwarf_AbbrevInfo *)malloc(
- sizeof(LibGoblin_Dwarf_AbbrevInfo) * i_abbrevs );
- if( NULL == p_abbrev ) { return 0x02; }
- memset( p_abbrev, 0x00,
- sizeof(LibGoblin_Dwarf_AbbrevInfo) * i_abbrevs );
+ // 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_size = psec_abbrev->qw_size;
+ *pi_filenum = 0;
+ *pi_abbrevs = 0;
do {
- /* Set Abbrev Data to AbbrevInfo Struct - Phase 1*/
- p_abbrev->pb_pos = pb_data;
- qw_remain = qw_size_abbrev;
+ (*pi_abbrevs)++;
/* Read Abbrev Number */
pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
- &qw_temp, pb_data, &qw_remain );
+ &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_remain );
+ &qw_temp, pb_data, &qw_size );
dw_tag = (DWord)qw_temp;
-
- /* Read IsChildren */
- b_children = *pb_data++;
- qw_remain--;
-
- /* Set Abbrev Data to AbbrevInfo Struct */
- p_abbrev->dw_tag = dw_tag;
- p_abbrev->dw_id = dw_abbrev_num;
-
if( DW_TAG_compile_unit == dw_tag ) {
- p_nowsrc = p_src++;
- p_nowsrc->p_abbrev_info = p_abbrev;
+ (*pi_filenum)++;
}
- /*printf("%04x : TAG=%04x (Children=%x) %ld\n",
- dw_abbrev_num, dw_tag, b_children, qw_size_abbrev);*/
+ /* Read IsChildren */
+ b_children = *pb_data++;
+ qw_size--;
do {
/* Read Attribute */
pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
- &qw_temp, pb_data, &qw_remain );
+ &qw_temp, pb_data, &qw_size );
dw_attribute = (DWord)qw_temp;
/* Read Format */
pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
- &qw_temp, pb_data, &qw_remain );
+ &qw_temp, pb_data, &qw_size );
dw_format = (DWord)qw_temp;
- /*printf(" Attiribute=%02x Format=%02x\n",
- dw_attribute, dw_format);*/
-
}while((0x00 != dw_attribute) && (0x00 != dw_format)
- && (qw_remain > 0) );
-
- p_abbrev->w_size = (Word)(qw_size_abbrev - qw_remain);
- p_abbrev++;
+ && (qw_size > 0) );
/* Skip Byte for Next Compile-Unit Abbrev. */
if( 0x00 == *pb_data ) {
pb_data++;
- qw_remain--;
+ qw_size--;
}
- }while((qw_remain > 0) && (dw_tag != 0x00));
+ }while((qw_size > 0) && (dw_tag != 0x00));
return 0x00;
}
}
p_bfile->dwarf.p_abbrev = p_abbrev;
p_bfile->dwarf.i_abbrevs = i_abbrevs;
-printf( "debug: %d\n", i_abbrevs );
-
// Read Abbrev ---
+ i_result = DWARF_Abbrev_ReadAbbrevEntry( p_binfo, p_bfile );
+ if( 0x00 != i_result ) {
+ return 0x01;
+ }
return 0x00;
}