From: Koine Yuusuke(koinec) Date: Wed, 21 Aug 2019 11:49:58 +0000 (+0900) Subject: (LibGoblin) X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=ec32363a8ee01218f6032d097520e2aff61226e6;p=drdeamon64%2Fdrdeamon64.git (LibGoblin) * WorkBackup --- diff --git a/libgoblin/drd64_libgoblin_debug_objinfo.c b/libgoblin/drd64_libgoblin_debug_objinfo.c index 1e5734b..5b682ab 100644 --- a/libgoblin/drd64_libgoblin_debug_objinfo.c +++ b/libgoblin/drd64_libgoblin_debug_objinfo.c @@ -44,17 +44,17 @@ static char gstr_type[256][9] = { "PROGHDR", // 0x03 "SECTION", // 0x04 "OBJFILE", // 0x05 - "FUNCTION", // 0x06 - "OBJECT", // 0x07 - - "COMMON", // 0x08 - "TLS", // 0x09 - "REL", // 0x0a - "", // 0x0b - "", // 0x0c + "TYPE:MUL", // 0x06 + "TYPE:SIG", // 0x07 + + "FUNCTION", // 0x08 + "OBJECT", // 0x09 + "COMMON", // 0x0a + "TLS", // 0x0b + "REL", // 0x0d "", // 0x0d - "TYPE(SIG)", // 0x0e - "TYPE(MUL)", // 0x0f + "", // 0x0e + "", // 0x0f "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", @@ -466,6 +466,33 @@ void return; } +/*--------------------------------------------------------------------*/ +void + Debug_ObjectInfo_Print_Type_Single( + LibGoblin_ObjectInfo *p_obj, + char *pstr_space, + Byte b_level ) +{ + printf(" %s\t\t[OBJINFO] Addr.Link(%3d <-> %3d)\n", + pstr_space, p_obj->addrlink.i_prev_id, p_obj->addrlink.i_next_id ); + printf(" %s\t\t[TYPE(Single)] size= %u, encoding= %xh\n", + pstr_space, p_obj->info.type.dw_size, p_obj->info.type.b_encoding ); + + return; +} + +/*--------------------------------------------------------------------*/ +void + Debug_ObjectInfo_Print_Type_Multi( + LibGoblin_ObjectInfo *p_obj, + char *pstr_space, + Byte b_level ) +{ + printf(" %s\t\t[OBJINFO] Addr.Link(%3d <-> %3d)\n", + pstr_space, p_obj->addrlink.i_prev_id, p_obj->addrlink.i_next_id ); + + return; +} /*====================================================================*/ /*--------------------------------------------------------------------*/ @@ -521,6 +548,14 @@ void Debug_ObjectInfo_Print_ObjectFile( p_obj, pstr_space, b_level ); break; + case OBJINFO_TYPE_TYPE_SINGLE: + Debug_ObjectInfo_Print_Type_Single( p_obj, pstr_space, b_level ); + break; + + case OBJINFO_TYPE_TYPE_MULTI: + Debug_ObjectInfo_Print_Type_Multi( p_obj, pstr_space, b_level ); + break; + case OBJINFO_TYPE_FUNCTION: Debug_ObjectInfo_Print_Function( p_obj, pstr_space, b_level ); break; diff --git a/libgoblin/drd64_libgoblin_dwarf_info.c b/libgoblin/drd64_libgoblin_dwarf_info.c index a05e1b5..e951a98 100644 --- a/libgoblin/drd64_libgoblin_dwarf_info.c +++ b/libgoblin/drd64_libgoblin_dwarf_info.c @@ -244,7 +244,7 @@ int } t_ancestry[i_childlv].pb_dwinfo = pb_now; - t_ancestry[i_childlv].i_objid = i_result; + t_ancestry[i_childlv].i_objid = i_objid; Debug_DWARF_PrintDIE( p_binfo, p_abbrev, dw_arvid, i_childlv ); diff --git a/libgoblin/drd64_libgoblin_dwarf_tag_dispatch.h b/libgoblin/drd64_libgoblin_dwarf_tag_dispatch.h index 9d202e5..bae5685 100644 --- a/libgoblin/drd64_libgoblin_dwarf_tag_dispatch.h +++ b/libgoblin/drd64_libgoblin_dwarf_tag_dispatch.h @@ -115,7 +115,7 @@ DWARF_TagFunction dwarf_tag[LIBGOBLIN_DWARF_TAG_MAX] = { { DW_TAG_subrange_type, DWARF_Tag_Array_UnImplement }, // 0x21: array { DW_TAG_with_stmt, DWARF_Tag_NotClang_UnImplement }, // 0x22: notclang { DW_TAG_access_declaration, DWARF_Tag_Class_UnImplement }, // 0x23: class -{ DW_TAG_base_type, DWARF_Tag_Type_UnImplement }, // 0x24: type +{ DW_TAG_base_type, DWARF_Tag_Type_base_type }, // 0x24: type { DW_TAG_catch_block, DWARF_Tag_Exception_UnImplement }, // 0x25: exception { DW_TAG_const_type, DWARF_Tag_Type_UnImplement }, // 0x26: type { DW_TAG_constant, DWARF_Tag_Parameter_UnImplement }, // 0x27: parameter diff --git a/libgoblin/drd64_libgoblin_dwarf_tag_type.c b/libgoblin/drd64_libgoblin_dwarf_tag_type.c index 6e89fb6..40a552e 100644 --- a/libgoblin/drd64_libgoblin_dwarf_tag_type.c +++ b/libgoblin/drd64_libgoblin_dwarf_tag_type.c @@ -38,7 +38,6 @@ Comment: #include"drd64_libgoblin.h" /*---------------------------------------------------------------------- -DW_TAG_base_type DW_TAG_unspecified_type DW_TAG_const_type DW_TAG_pointer_type @@ -67,8 +66,58 @@ int return 0x00; } + /*---------------------------------------------------------------------- + DW_TAG_base_type + DW_AT_name + DW_AT_encoding + DW_AT_byte_size ----------------------------------------------------------------------*/ +LIBGOBLIN_DWARF_TAG_TYPE_EXTERN +int + DWARF_Tag_Type_base_type( + DWord dw_tag, + LibGoblin_BinaryInfo *p_binfo, + int i_childlv, + LibGoblin_DWARF_Info_Ancestry *p_ancestry, + LibGoblin_DWARF_Info_CUHeader *p_cuheader ) +{ + int i_obj_parent; + PtrValue ptrval_start; + LibGoblin_ObjectInfo *pobj_now; + LibGoblin_ObjectInfo *pobj_parent; + LibGoblin_ProgramInfo *p_pginfo; + LibGoblin_DWARF_DIEValue *pval_name; + LibGoblin_DWARF_DIEValue *pval_byte_size; + LibGoblin_DWARF_DIEValue *pval_encoding; + + // Data Extract + pval_name = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_name ); + pval_byte_size = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_byte_size ); + pval_encoding = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_encoding ); + + i_obj_parent = p_ancestry[i_childlv - 1].i_objid; + + p_pginfo = ProgInfo_GetProgInfo( p_binfo->i_pginfo ); + assert( NULL != p_pginfo ); + + pobj_parent = ObjectInfo_GetObjectInfo( p_pginfo, i_obj_parent ); + ptrval_start = pobj_parent->addr.ptr_addr.value; + + pobj_now = ObjectInfo_InsetObject( + p_pginfo, ptrval_start, (QWord)0, pobj_parent, + OBJINFO_INSETMODE_ADOPT, OBJINFO_TYPE_TYPE_SINGLE ); + if( NULL == pobj_now ) { + return NO_OBJ; + } + + pobj_now->pstr_name = pval_name->value.pstr_value; + pobj_now->info.type.dw_size = (DWord)pval_byte_size->value.b_value; + pobj_now->info.type.b_encoding = pval_encoding->value.b_value; + + return pobj_now->i_id; +} + diff --git a/libgoblin/drd64_libgoblin_dwarf_tag_type.h b/libgoblin/drd64_libgoblin_dwarf_tag_type.h index 627b7e8..e035320 100644 --- a/libgoblin/drd64_libgoblin_dwarf_tag_type.h +++ b/libgoblin/drd64_libgoblin_dwarf_tag_type.h @@ -50,6 +50,11 @@ LIBGOBLIN_DWARF_TAG_TYPE_EXTERN DWord dw_tag, LibGoblin_BinaryInfo *p_binfo, int i_childlv, LibGoblin_DWARF_Info_Ancestry *p_ancestry, LibGoblin_DWARF_Info_CUHeader *p_cuheader ); +LIBGOBLIN_DWARF_TAG_TYPE_EXTERN + int DWARF_Tag_Type_base_type( + DWord dw_tag, LibGoblin_BinaryInfo *p_binfo, + int i_childlv, LibGoblin_DWARF_Info_Ancestry *p_ancestry, + LibGoblin_DWARF_Info_CUHeader *p_cuheader ); #endif /* DRD64_HEADER_LIBGOBLIN_BINFO */ diff --git a/libgoblin/drd64_libgoblin_objinfo.c b/libgoblin/drd64_libgoblin_objinfo.c index 6862f66..75cca77 100644 --- a/libgoblin/drd64_libgoblin_objinfo.c +++ b/libgoblin/drd64_libgoblin_objinfo.c @@ -388,7 +388,7 @@ LibGoblin_ObjectInfo * && ( ptr_value < (p_objnow->addr.ptr_addr.value + p_objnow->addr.qw_size)) )) { if(( ptr_value == p_objnow->addr.ptr_addr.value ) - && ( qw_size == p_objnow->addr.qw_size )) { + && ( qw_size <= p_objnow->addr.qw_size )) { if( b_type >= p_objnow->b_type ) { if( p_objnow->addr.qw_size <= p_objover->addr.qw_size ) { p_objover = p_objnow; } @@ -403,7 +403,7 @@ LibGoblin_ObjectInfo * if( ptr_value == p_objnow->addr.ptr_addr.value ) { if( qw_size > p_objnow->addr.qw_size ) { break; } - else if( qw_size == p_objnow->addr.qw_size ) { + else if( qw_size <= p_objnow->addr.qw_size ) { if( b_type < p_objnow->b_type ) { break; } } } @@ -442,7 +442,7 @@ LibGoblin_ObjectInfo * if( ptr_value == p_objnow->addr.ptr_addr.value ) { if( qw_size > p_objnow->addr.qw_size ) { break; } - else if( qw_size == p_objnow->addr.qw_size ) { + else if( qw_size <= p_objnow->addr.qw_size ) { if( b_type < p_objnow->b_type ) { break; } } } diff --git a/libgoblin/drd64_libgoblin_type.h b/libgoblin/drd64_libgoblin_type.h index 7a078c7..3fd4fcc 100644 --- a/libgoblin/drd64_libgoblin_type.h +++ b/libgoblin/drd64_libgoblin_type.h @@ -95,13 +95,13 @@ typedef struct { #define OBJINFO_TYPE_PROGHDR 0x03 #define OBJINFO_TYPE_SECTION 0x04 #define OBJINFO_TYPE_OBJFILE 0x05 -#define OBJINFO_TYPE_FUNCTION 0x06 -#define OBJINFO_TYPE_OBJECT 0x07 -#define OBJINFO_TYPE_COMMON 0x08 -#define OBJINFO_TYPE_TLS 0x09 -#define OBJINFO_TYPE_REL 0x0a -#define OBJINFO_TYPE_TYPE_SINGLE 0x0e -#define OBJINFO_TYPE_TYPE_MULTI 0x0f +#define OBJINFO_TYPE_TYPE_MULTI 0x06 +#define OBJINFO_TYPE_TYPE_SINGLE 0x07 +#define OBJINFO_TYPE_FUNCTION 0x08 +#define OBJINFO_TYPE_OBJECT 0x09 +#define OBJINFO_TYPE_COMMON 0x0a +#define OBJINFO_TYPE_TLS 0x0b +#define OBJINFO_TYPE_REL 0x0c #define OBJINFO_TYPE_NONE 0x7f typedef struct { @@ -196,6 +196,7 @@ typedef struct { struct { DWord dw_size; + Byte b_encoding; LibGoblin_ObjInfo_Link t_link; } type;