OSDN Git Service

2019/05/18(Sat) 19:48
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sat, 18 May 2019 10:48:20 +0000 (19:48 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sat, 18 May 2019 10:48:20 +0000 (19:48 +0900)
 (LibGoblin)
  * WorkBackup (Changing .dwarf_info reading mechanism)

13 files changed:
libgoblin/Makefile
libgoblin/drd64_libgoblin.h
libgoblin/drd64_libgoblin_binaryfile.c
libgoblin/drd64_libgoblin_dwarf.c
libgoblin/drd64_libgoblin_dwarf_abbrev.c
libgoblin/drd64_libgoblin_dwarf_abbrev.h
libgoblin/drd64_libgoblin_dwarf_common.c
libgoblin/drd64_libgoblin_dwarf_info.c
libgoblin/drd64_libgoblin_dwarf_info.h
libgoblin/drd64_libgoblin_dwarf_tag.c [new file with mode: 0644]
libgoblin/drd64_libgoblin_dwarf_tag.h [new file with mode: 0644]
libgoblin/drd64_libgoblin_srcfile.c
libgoblin/drd64_libgoblin_type.h

index 23629a5..f12b6df 100644 (file)
@@ -72,6 +72,7 @@ OBJS = drd64_libgoblin_api.o \
                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
@@ -102,6 +103,7 @@ HEADER = drd64_libgoblin.h \
                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 \
@@ -220,6 +222,10 @@ drd64_libgoblin_dwarf_line.o: \
                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
index f4a41a4..781dc0e 100644 (file)
@@ -96,6 +96,7 @@ Comment:
 #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"
index 1bf754b..3f5a331 100644 (file)
@@ -92,8 +92,9 @@ void
 
        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 ) );
index b8eaccb..8fd52c3 100644 (file)
@@ -129,7 +129,7 @@ int
        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 );
@@ -150,7 +150,12 @@ int
 {
        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;
        }
index f017b35..3528699 100644 (file)
@@ -57,7 +57,7 @@ void
        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,
@@ -151,39 +151,52 @@ Byte *
 
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
+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 );
@@ -193,14 +206,12 @@ int
                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++;
@@ -218,17 +229,27 @@ int
 
                }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;
 }
 
@@ -239,6 +260,7 @@ int
        DWARF_Abbrev_GetItems(
                int             *pi_filenum,
                int             *pi_abbrevs,
+               QWord   *pqw_size,
                LibGoblin_BinaryInfo    *p_binfo )
 {
        Byte    *pb_data;
@@ -259,8 +281,9 @@ int
        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;
@@ -311,12 +334,13 @@ int
 ----------------------------------------------------------------------*/
 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;
 
@@ -324,7 +348,7 @@ int
        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;
        }
@@ -334,14 +358,12 @@ int
        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;
 }
index c95a75a..cb68e57 100644 (file)
@@ -51,7 +51,11 @@ 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 );
+       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 ---
index dc21d1d..cf9f6bb 100644 (file)
@@ -115,6 +115,7 @@ Byte *
 
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
+/*
 LIBGOBLIN_DWARF_COMMON_EXTERN
 Byte *
        LibGoblin_DwarfCommon_Read_CUHeader(
@@ -133,7 +134,7 @@ Byte *
        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; }
@@ -152,13 +153,13 @@ Byte *
                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 );
@@ -176,7 +177,7 @@ Byte *
                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; }
@@ -186,7 +187,7 @@ Byte *
        
        return pb_data;
 }
-
+*/
 
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
index ed0fe8a..f45b654 100644 (file)
@@ -263,7 +263,7 @@ Byte *
        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;
@@ -272,7 +272,7 @@ Byte *
 
        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; }
 
@@ -295,121 +295,121 @@ Byte *
                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:
@@ -425,46 +425,76 @@ Byte *
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
 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;
 }
 
 
@@ -472,43 +502,79 @@ Byte *
 ----------------------------------------------------------------------*/
 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;
 }
index e1bba21..a8593a2 100644 (file)
@@ -93,11 +93,15 @@ typedef struct      {
        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 */
diff --git a/libgoblin/drd64_libgoblin_dwarf_tag.c b/libgoblin/drd64_libgoblin_dwarf_tag.c
new file mode 100644 (file)
index 0000000..fd3833d
--- /dev/null
@@ -0,0 +1,49 @@
+/*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 ----------------------------------- */
diff --git a/libgoblin/drd64_libgoblin_dwarf_tag.h b/libgoblin/drd64_libgoblin_dwarf_tag.h
new file mode 100644 (file)
index 0000000..376932b
--- /dev/null
@@ -0,0 +1,139 @@
+/*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 ----------------------------------- */
index 7f7fc2b..7184c79 100644 (file)
@@ -127,8 +127,9 @@ LibGoblin_SrcFile   *
 
 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:
@@ -214,7 +215,8 @@ void
 
        memset( p_srcfile, 0x00, sizeof( LibGoblin_SrcFile ) );
 
-       p_srcfile->i_id = -0x01;
+       p_srcfile->i_id                 = -0x01;
+       p_srcfile->i_bfile_id   = -0x01;
 
        return;
 }
index 4adcf81..4e4e346 100644 (file)
@@ -206,6 +206,13 @@ typedef struct     {
        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;
 
 
@@ -257,8 +264,12 @@ typedef struct     {
        } 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;