/*----------------------------------------------------------------------
----------------------------------------------------------------------*/
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_max; 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,
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
- LibGoblin_DwarfAbbrev_GetItems(
- int *pi_filenum,
- int *pi_abbrevs,
- LibGoblin_BinaryInfo *p_bin )
+ DWARF_Abbrev_ReadAbbrevEntry(
+ DWARF_AbbrevEntry **pp_abbrev,
+ int *pi_abbrevs,
+ LibGoblin_BinaryInfo *p_binfo,
+ 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_size_abbrev;
+ QWord qw_remain;
DWord dw_abbrev_num;
+ DWord dw_before_num;
DWord dw_tag;
DWord dw_attribute;
DWord dw_format;
- LibGoblin_Debug_Dwarf *p_dwarf;
+ LibGoblin_SectionInfo *psec_abbrev;
+ DWARF_AbbrevEntry *p_arvnow;
- assert( NULL != p_bin );
+ assert( NULL != pp_abbrev );
+ assert( NULL != pi_abbrevs );
+ assert( NULL != p_binfo );
+ assert( NULL != p_bfile );
- p_dwarf = (LibGoblin_Debug_Dwarf *)p_bin->p_debug;
- assert( NULL != p_dwarf );
+ *pp_abbrev = NULL;
+ *pi_abbrevs = 0;
- /* Get .debug_abbrev section Info */
- pb_data = LibGoblin_Elf_GetSection(
- &qw_size_abbrev, p_bin,
- LIBGOBLIN_ELF_SEC_ID_DEBUG_ABBREV );
- if( NULL == pb_data ) { return 0x01; }
+ // 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_offset;
+ qw_remain = p_bfile->dwarf.qw_abbrev_unreadsz;
- *pi_filenum = 0;
- *pi_abbrevs = 0;
+ 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 {
- (*pi_abbrevs)++;
-
- /* Read Abbrev Number */
- pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
- &qw_temp, pb_data, &qw_size_abbrev );
+ // Read Abbrev Number ---
+ 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_size_abbrev );
+ pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_remain );
dw_tag = (DWord)qw_temp;
- if( DW_TAG_compile_unit == dw_tag ) {
- (*pi_filenum)++;
- }
+
+ if(( 0x00 == dw_tag ) || (dw_abbrev_num < dw_before_num )) { break; }
/* Read IsChildren */
b_children = *pb_data++;
- qw_size_abbrev--;
+ qw_remain--;
+ i_items = -1;
do {
+ i_items++;
+
/* Read Attribute */
- pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
- &qw_temp, pb_data, &qw_size_abbrev );
+ 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_size_abbrev );
+ pb_data = DWARF_Common_DecodeULEB128( &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;
- /* Skip Byte for Next Compile-Unit Abbrev. */
+ }while((0x00 != dw_attribute) && (0x00 != dw_format) && (qw_remain > 0) );
+
+ // Skip Byte for Abbrev
if( 0x00 == *pb_data ) {
pb_data++;
- qw_size_abbrev--;
+ qw_remain--;
}
- }while((qw_size_abbrev > 0) && (dw_tag != 0x00));
+ 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;
}
/*----------------------------------------------------------------------
----------------------------------------------------------------------*/
-LIBGOBLIN_DWARF_ABBREV_EXTERN
int
- LibGoblin_DwarfAbbrev_Read(
- LibGoblin_BinaryInfo *p_bin,
- int i_abbrevs )
+ 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;
- 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 = LibGoblin_Elf_GetSection(
- &qw_size_abbrev, p_bin,
- LIBGOBLIN_ELF_SEC_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;
+ *pqw_size = psec_abbrev->qw_size;
+ *pi_filenum = 0;
+ *pi_abbrevs = 0;
+ i_maxitems = 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 );
+ 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_remain );
+ pb_data = DWARF_Common_DecodeULEB128( &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--;
+ 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_size );
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_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) );
+ }while((0x00 != dw_attribute) && (0x00 != dw_format) && (qw_size > 0) );
- p_abbrev->w_size = (Word)(qw_size_abbrev - qw_remain);
- p_abbrev++;
+ if( i_maxitems < i_items ) { i_maxitems = i_items; }
/* 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));
+
+ *pi_maxitems = i_maxitems;
return 0x00;
}
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+LIBGOBLIN_DWARF_ABBREV_EXTERN
+int
+ 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, &i_maxitems, &qw_size, p_binfo );
+ if( 0x00 != i_result ) {
+ return 0x01;
+ }
+
+ // Alloc Abbrev Memory ---
+ p_abbrev = (DWARF_AbbrevEntry *)malloc( sizeof( DWARF_AbbrevEntry ) * i_abbrevs );
+ if( NULL == p_abbrev ) {
+ return 0x02;
+ }
+ 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;
+
+ 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;
+}
+
/* EOF of drd64_.c ----------------------------------- */