OSDN Git Service

(LibGoblin)
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sun, 2 Jun 2019 02:14:02 +0000 (11:14 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sun, 2 Jun 2019 02:14:02 +0000 (11:14 +0900)
  * WorkBackup

libgoblin/drd64_libgoblin_debug_dwarf.c
libgoblin/drd64_libgoblin_debug_dwarf_str.c
libgoblin/drd64_libgoblin_debug_dwarf_str.h
libgoblin/drd64_libgoblin_dwarf_info.c
libgoblin/drd64_libgoblin_dwarf_info.h

index 0bed2e9..021c845 100644 (file)
@@ -51,7 +51,6 @@ void
        int             i_cnt;
        int             i_end;
        char    str_space[65];
-       DWord   dw_tag;
        QWord   qw_cnt;
        LibGoblin_DWARF_DIEValue        *p_val;
        DWARF_AbbrevEntry                       *p_arvnow;
@@ -89,8 +88,8 @@ void
                        case LIBGOBLIN_DWARF_INFO_TYPE_BLOCK:
                                printf( "[Block] Size= %ld (", p_val->qw_size );
                                for( qw_cnt = 0; qw_cnt < p_val->qw_size; qw_cnt++ )
-                                       { printf("%0xh ", *(p_val->value.pb_data + qw_cnt) ); }
-                               puts(")");
+                                       { printf(" %0xh", *(p_val->value.pb_data + qw_cnt) ); }
+                               puts(" )");
                                break;
                        default:
                                break;
index 7e30cb5..53edbcd 100644 (file)
@@ -109,7 +109,6 @@ char *
        Debug_DWARF_GetFormName(
                        DWord   dw_form )
 {
-       int             i_cnt;
        char    *pstr_name      = NULL;
 
        if( DEBUG_DWARF_STR_FORM_MAX >= dw_form )       {
index 730c310..a3a00ce 100644 (file)
@@ -381,10 +381,10 @@ LibGoblin_Debug_DWARF_Str_ATExtension
 #define        DEBUG_DWARF_STR_FORM_MAX        0x21
 
 #ifndef DRD64_SRC_LIBGOBLIN_DEBUG_DWARF_STR
-       extern  char    *gstr_dwarf_form[ 32 ];
+       extern  char    gstr_dwarf_form[ 32 ];
        extern  char    *gpstr_dwarf_form_name[DEBUG_DWARF_STR_FORM_MAX + 1];
 #else
-       char    *gstr_dwarf_form[ 32 ];
+       char    gstr_dwarf_form[ 32 ];
        char    *gpstr_dwarf_form_name[DEBUG_DWARF_STR_FORM_MAX + 1] = {
                "none_FORM: 0x00",              // 0x00
                "DW_FORM_addr",                 // 0x01
index 7b4eb75..a188017 100644 (file)
@@ -47,7 +47,6 @@ Byte *
                Byte    b_bytes,
                Byte    *pb_custart )
 {
-       Byte    *pb_link;
        Byte    b_size;
        Word    w_size;
        DWord   dw_size;
@@ -244,6 +243,34 @@ Byte *
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
 Byte *
+       DWARF_Info_ReadFormat_Offset(
+               LibGoblin_DWARF_DIEValue        *p_val,
+               Byte    *pb_src, 
+               QWord   *pqw_remain,
+               LibGoblin_BinaryInfo    *p_binfo,
+               Byte    b_bits )
+{
+       assert( NULL != pb_src );
+       assert( NULL != p_val );
+
+       if( 8 == b_bits )       {
+               pb_src  = DWARF_Common_Read_QWord( &(p_val->value.qw_value), pb_src, pqw_remain );
+               p_val->b_type   = LIBGOBLIN_DWARF_INFO_TYPE_QWORD;
+               p_val->qw_size  = 8;
+       }
+       else if( 4 == b_bits )  {
+               pb_src  = DWARF_Common_Read_DWord( &(p_val->value.dw_value), pb_src, pqw_remain );
+               p_val->b_type   = LIBGOBLIN_DWARF_INFO_TYPE_DWORD;
+               p_val->qw_size  = 4;
+       }
+
+       return pb_src;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+Byte *
        DWARF_Info_ReadFormat_InDirect(
                LibGoblin_DWARF_DIEValue        *p_val,
                Byte    *pb_info,
@@ -277,8 +304,6 @@ Byte *
                LibGoblin_BinaryInfo    *p_binfo,
                LibGoblin_DWARF_Info_CUHeader   *p_cuheader )
 {
-       QWord   qw_cnt;
-
        switch( dw_format )     {
                case DW_FORM_addr:              // 0x01: address
                        pb_info = DWARF_Info_ReadFormat_Address(
@@ -303,7 +328,7 @@ Byte *
                case DW_FORM_data8:             // 0x07: const. line/loc/mac/rng-ptr
                        pb_info = DWARF_Common_Read_QWord( &(p_val->value.qw_value), pb_info, pqw_remains );
                        p_val->b_type   = LIBGOBLIN_DWARF_INFO_TYPE_QWORD;
-                       p_val->qw_size  = 4;
+                       p_val->qw_size  = 8;
                        break;
                case DW_FORM_string:    // 0x08: string
                        pb_info = DWARF_Info_ReadFormat_String( p_val, pb_info, pqw_remains );
@@ -370,19 +395,31 @@ Byte *
                        // offset from the beginning of the .debug_line section
                        //  to the first byte of the data making up the line number list for the compilation unit.
                        // 1: const. value (size: offsetsize)
+                       pb_info = DWARF_Info_ReadFormat_Offset(
+                                                               p_val, pb_info, pqw_remains, p_binfo, p_cuheader->b_offsetsize );
                        break;
                case DW_FORM_exprloc:           // 0x18:
                        // 1: uLEB128 = length
                        // 2: info. bytes specified by the length(1:) (DWARF expression)
+                       pb_info = DWARF_Info_ReadFormat_Block( p_val, pb_info, pqw_remains, -1);
                        break;
                case DW_FORM_flag_present:      // 0x19:
                        // have NONE value because implicitly flag is TRUE.
+                       //   => NONE Proc.
                        break;
                case DW_FORM_ref_sig8:          // 0x20:
+                       // 1: pointer (8byte)
+                       pb_info = DWARF_Common_Read_QWord( &(p_val->value.qw_value), pb_info, pqw_remains );
+                       p_val->b_type   = LIBGOBLIN_DWARF_INFO_TYPE_QWORD;
+                       p_val->qw_size  = 8;
                        break;
                case DW_FORM_GNU_ref_alt:       // 0x1f20:
+                       pb_info = DWARF_Info_ReadFormat_Offset(
+                                                               p_val, pb_info, pqw_remains, p_binfo, p_cuheader->b_offsetsize );
                        break;
                case DW_FORM_GNU_strp_alt:      // 0x1f21:
+                       pb_info = DWARF_Info_ReadFormat_Offset(
+                                                               p_val, pb_info, pqw_remains, p_binfo, p_cuheader->b_offsetsize );
                        break;
                default:
                        break;
@@ -459,6 +496,33 @@ Byte *
        i_readbytes     += 1;
 
        p_cuhead->qw_unitsize   -= i_readbytes;
+
+       // for DWARF4 ---
+       if( 4 == p_cuhead->w_version )  {
+               // Read type-signature (8Byte) ---
+               pb_info = DWARF_Common_Read_QWord( &qw_qword, pb_info, pqw_size_info );
+               if( NULL == pb_info )   { return NULL; }
+               i_readbytes     += 8;
+
+               p_cuhead->qw_type_signature     = qw_qword;
+
+               // Read type_offset (4Byte(32bit), 8Byte(64bit)) ---
+               if( 64 == i_bitflag )   {
+                       pb_info = DWARF_Common_Read_QWord( &qw_qword, pb_info, pqw_size_info );
+                       if( NULL == pb_info )   { return NULL; }
+                       i_readbytes     += 8;
+
+                       p_cuhead->qw_type_offset        = qw_qword;
+               }
+               else    {
+                       pb_info = DWARF_Common_Read_DWord( &dw_dword, pb_info, pqw_size_info );
+                       if( NULL == pb_info )   { return NULL; }
+                       i_readbytes     += 4;
+
+                       p_cuhead->qw_type_offset        = (QWord)dw_dword;
+               }
+
+       }
        
        return pb_info;
 }
index d451508..580a554 100644 (file)
@@ -55,6 +55,9 @@ typedef struct  {
        Byte    b_offsetsize;
        QWord   qw_abbrev_offset;
        Byte    *pb_custart;
+
+       QWord   qw_type_signature;      // for DWARF4
+       QWord   qw_type_offset;         // for DWARF4
 } LibGoblin_DWARF_Info_CUHeader;