OSDN Git Service

2019/05/08(Wed) 20:58
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Wed, 8 May 2019 11:58:07 +0000 (20:58 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Wed, 8 May 2019 11:58:07 +0000 (20:58 +0900)
 (LibGoblin)
  * WorkBackup

libgoblin/drd64_libgoblin_dwarf.c
libgoblin/drd64_libgoblin_dwarf_abbrev.c
libgoblin/drd64_libgoblin_dwarf_abbrev.h

index d1d8d79..b8eaccb 100644 (file)
@@ -155,6 +155,7 @@ int
                return 0x01;
        }
 
+       Debug_DWARF_Abbrev_Dump( p_binfo, 0x01 );
        return  0x00;
 }
 
index 1daf66b..ad33387 100644 (file)
@@ -40,6 +40,48 @@ Comment:
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
 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,
@@ -114,22 +156,25 @@ Byte *
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
 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 );
@@ -137,52 +182,60 @@ int
        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;
 }
@@ -190,106 +243,77 @@ int
 
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
-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;
 }
@@ -324,10 +348,12 @@ int
        }
        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;
 }
index 08a9d5d..c95a75a 100644 (file)
@@ -47,6 +47,8 @@ Comment:
 
 #define        LIBGOBLIN_DWARF_ABBREV_MAXITEMS 30
 
+LIBGOBLIN_DWARF_ABBREV_EXTERN
+       void Debug_DWARF_Abbrev_Dump( LibGoblin_BinaryInfo *p_binfo, Byte b_level );
 
 LIBGOBLIN_DWARF_ABBREV_EXTERN
        int DWARF_Abbrev_Read( LibGoblin_BinaryInfo *p_binfo );
@@ -78,7 +80,7 @@ LIBGOBLIN_DWARF_ABBREV_EXTERN
                        LibGoblin_Dwarf_AbbrevEntry     *p_entry,
                        Byte    *pb_src,
                        QWord   *pqw_remain );
-
+/*
 LIBGOBLIN_DWARF_ABBREV_EXTERN
        int
                LibGoblin_DwarfAbbrev_GetItems(
@@ -91,7 +93,7 @@ LIBGOBLIN_DWARF_ABBREV_EXTERN
                LibGoblin_DwarfAbbrev_Read(
                        LibGoblin_BinaryInfo    *p_bin,
                        int     i_abbrevs );
-
+*/
 
 #endif /* DRD64_HEADER_LIBGOBLIN_BINFO */