OSDN Git Service

(LibGoblin)
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sun, 25 Aug 2019 12:33:35 +0000 (21:33 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sun, 25 Aug 2019 12:33:35 +0000 (21:33 +0900)
  * WorkBackup

libgoblin/Makefile
libgoblin/drd64_libgoblin.h
libgoblin/drd64_libgoblin_api.c
libgoblin/drd64_libgoblin_dwarf_tag_dispatch.h
libgoblin/drd64_libgoblin_dwarf_tag_type.c
libgoblin/drd64_libgoblin_dwarf_tag_type.h
libgoblin/drd64_libgoblin_objinfo.c
libgoblin/drd64_libgoblin_objinfo.h
libgoblin/drd64_libgoblin_objinfo_postproc.c [new file with mode: 0644]
libgoblin/drd64_libgoblin_objinfo_postproc.h [new file with mode: 0644]
libgoblin/drd64_libgoblin_type.h

index 7207e45..53bf422 100644 (file)
@@ -57,6 +57,7 @@ OBJS = drd64_libgoblin_api.o \
                drd64_libgoblin_readbin.o \
                drd64_libgoblin_loadprog.o \
                drd64_libgoblin_objinfo.o \
+               drd64_libgoblin_objinfo_postproc.o \
                drd64_libgoblin_section.o \
                drd64_libgoblin_elf.o \
                drd64_libgoblin_elf_dynamic.o \
@@ -103,6 +104,7 @@ HEADER = drd64_libgoblin.h \
                drd64_libgoblin_readbin.h \
                drd64_libgoblin_loadprog.h \
                drd64_libgoblin_objinfo.h \
+               drd64_libgoblin_objinfo_postproc.h \
                drd64_libgoblin_section.h \
                drd64_libgoblin_elf.h \
                drd64_libgoblin_elf_dynamic.h \
@@ -202,6 +204,9 @@ drd64_libgoblin_loadprog.o: drd64_libgoblin_loadprog.c $(HEADER)
 drd64_libgoblin_objinfo.o: drd64_libgoblin_objinfo.c $(HEADER)
        $(CC) -c -o drd64_libgoblin_objinfo.o $(FLAGS_DEBUG) \
                                drd64_libgoblin_objinfo.c
+drd64_libgoblin_objinfo_postproc.o: drd64_libgoblin_objinfo_postproc.c $(HEADER)
+       $(CC) -c -o drd64_libgoblin_objinfo_postproc.o $(FLAGS_DEBUG) \
+                               drd64_libgoblin_objinfo_postproc.c
 drd64_libgoblin_section.o: drd64_libgoblin_section.c $(HEADER)
        $(CC) -c -o drd64_libgoblin_section.o $(FLAGS_DEBUG) \
                                drd64_libgoblin_section.c
index 0ee9247..e839c3a 100644 (file)
@@ -83,6 +83,7 @@ Comment:
 #include"drd64_libgoblin_loadprog.h"
 #include"drd64_libgoblin_section.h"
 #include"drd64_libgoblin_objinfo.h"
+#include"drd64_libgoblin_objinfo_postproc.h"
 #include"drd64_libgoblin_elf.h"
 #include"drd64_libgoblin_elf_dynamic.h"
 #include"drd64_libgoblin_elf_dynsym.h"
index 4332cc1..3585a42 100644 (file)
@@ -87,7 +87,16 @@ int
                                DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x04 ),
                                LOCATION( FUNCID_LibGoblin_AnalyzeMainProgram ),
                                errno, (QWord)i_result, (QWord)0x00, __LINE__ );
-               return -0x03;
+               return -0x04;
+       }
+
+       i_result        = ObjectInfo_PostProc( p_pginfo, p_binfo );
+       if( 0x00 != i_result )  {
+               LibBrownie_Error_SetErrorInfo(
+                               DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x05 ),
+                               LOCATION( FUNCID_LibGoblin_AnalyzeMainProgram ),
+                               errno, (QWord)i_result, (QWord)0x00, __LINE__ );
+               return -0x05;
        }
 
        // XXX: for DEBUG!
index bae5685..cd0b73f 100644 (file)
@@ -117,7 +117,7 @@ DWARF_TagFunction   dwarf_tag[LIBGOBLIN_DWARF_TAG_MAX]      = {
 { DW_TAG_access_declaration,   DWARF_Tag_Class_UnImplement },          // 0x23: class
 { 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_const_type,                   DWARF_Tag_Type_const_type },            // 0x26: type
 { DW_TAG_constant,                             DWARF_Tag_Parameter_UnImplement },      // 0x27: parameter
 { DW_TAG_enumerator,                   DWARF_Tag_Array_UnImplement },          // 0x28: array
 { 0x29,                                                        NULL },
index 05a3943..7401345 100644 (file)
@@ -68,6 +68,64 @@ int
 
 
 /*----------------------------------------------------------------------
+  DW_TAG_const_type
+       DW_AT_type
+----------------------------------------------------------------------*/
+LIBGOBLIN_DWARF_TAG_TYPE_EXTERN
+int
+       DWARF_Tag_Type_const_type(
+               DWord                                   dw_tag,
+               LibGoblin_BinaryInfo    *p_binfo,
+               int                                             i_childlv,
+        LibGoblin_DWARF_Info_Ancestry  *p_ancestry,
+               LibGoblin_DWARF_Info_CUHeader   *p_cuheader )
+{
+       Byte            *pb_link;
+       int                     i_obj_parent;
+       PtrValue        ptrval_start;
+       LibGoblin_ObjectInfo            *pobj_now;
+       LibGoblin_ObjectInfo            *pobj_parent;
+       LibGoblin_ProgramInfo           *p_pginfo;
+       LibGoblin_DWARF_DIEValue        *pval_type;
+
+       // Data Extract
+       pval_type               = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_type );
+
+       if( NULL == pval_type ) {
+               return -0x02;
+       }
+
+       pb_link = pval_type->value.pb_link;
+
+       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 -0x03;
+       }
+
+       pobj_now->pstr_name                                     = "const";
+       pobj_now->info.type.i_objid_type        = NO_OBJ;
+       pobj_now->info.type.p_dwtype            = pb_link;
+       pobj_now->info.type.dw_size                     = 0;
+       pobj_now->info.type.b_encoding          = 0x00;
+       pobj_now->info.type.b_bit_size          = 0;
+       pobj_now->info.type.b_bit_offset        = 0;
+       pobj_now->info.type.b_endianity         = DW_END_default;
+
+       return pobj_now->i_id;
+}
+
+
+/*----------------------------------------------------------------------
   DW_TAG_base_type
        DW_AT_name
        DW_AT_encoding
@@ -129,9 +187,12 @@ int
                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;
+       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;
+       pobj_now->info.type.b_endianity         = DW_END_default;
+       pobj_now->info.type.i_objid_type        = NO_OBJ;
+       pobj_now->info.type.p_dwtype            = NULL;
 
        if( NULL != pval_bit_size )
                { pobj_now->info.type.b_bit_size        = pval_bit_size->value.b_value; }
index e035320..dffd8b9 100644 (file)
@@ -51,6 +51,11 @@ LIBGOBLIN_DWARF_TAG_TYPE_EXTERN
                                int i_childlv, LibGoblin_DWARF_Info_Ancestry *p_ancestry,
                                LibGoblin_DWARF_Info_CUHeader *p_cuheader );
 LIBGOBLIN_DWARF_TAG_TYPE_EXTERN
+       int DWARF_Tag_Type_const_type(
+                               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,
index 75cca77..6a46238 100644 (file)
@@ -230,6 +230,7 @@ int
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
 #define        FUNCID_LibGoblin_ObjectInfo_AdoptObjectInfo     0x23
+LIBGOBLIN_OBJINFO_EXTERN
 int
        ObjectInfo_AdoptObjectInfo(
                        LibGoblin_ProgramInfo   *p_pginfo,
index bda637c..8f66820 100644 (file)
@@ -73,6 +73,10 @@ LIBGOBLIN_OBJINFO_EXTERN
                        LibGoblin_ProgramInfo *p_pginfo, LibGoblin_ObjectInfo *p_objinfo );
 LIBGOBLIN_OBJINFO_EXTERN
        LibGoblin_ObjectInfo *ObjectInfo_AllocObjectInfo( LibGoblin_ProgramInfo *p_pginfo );
+LIBGOBLIN_OBJINFO_EXTERN
+       int ObjectInfo_AdoptObjectInfo(
+                       LibGoblin_ProgramInfo *p_pginfo, LibGoblin_ObjectInfo *p_parent,
+                       LibGoblin_ObjectInfo *p_child );
 #define        OBJINFO_INSETMODE_PUT           0x00
 #define        OBJINFO_INSETMODE_INSET         0x01    // bit 0
 #define        OBJINFO_INSETMODE_ADOPT         0x02    // bit 1
diff --git a/libgoblin/drd64_libgoblin_objinfo_postproc.c b/libgoblin/drd64_libgoblin_objinfo_postproc.c
new file mode 100644 (file)
index 0000000..16d7815
--- /dev/null
@@ -0,0 +1,116 @@
+/*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_OBJINFO_POSTPROC
+#include"drd64_libgoblin.h"
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+int
+       ObjectInfo_PostProc_ResolvTypeLink(
+               LibGoblin_ProgramInfo   *p_pginfo,
+               LibGoblin_BinaryInfo    *p_binfo,
+               LibGoblin_ObjectInfo    *pobj_now )
+{
+       int                                             i_result;
+       int                                             i_objid_parent;
+       Byte                                    *pb_dwinfo;
+       LibGoblin_ObjectInfo    *pobj_parent;
+
+       if(( OBJINFO_TYPE_TYPE_SINGLE != pobj_now->b_type )
+                               && ( OBJINFO_TYPE_TYPE_MULTI != pobj_now->b_type ))
+               { goto  goto_ObjectInfo_PostProc_ResolvTypeLink_post; }
+
+       if( NULL == pobj_now->info.type.p_dwtype )
+               { goto  goto_ObjectInfo_PostProc_ResolvTypeLink_post; }
+
+       pb_dwinfo               = pobj_now->info.type.p_dwtype;
+       i_objid_parent  = Index_DWARFInfo_SearchObjectInfo( p_binfo, pb_dwinfo );
+       if( NO_OBJ != i_objid_parent )  {
+               pobj_parent     = OBJINFO( p_pginfo, i_objid_parent );
+               i_result        = ObjectInfo_AdoptObjectInfo( p_pginfo, pobj_parent, pobj_now );
+       }
+
+goto_ObjectInfo_PostProc_ResolvTypeLink_post:
+       return 0x00;
+}
+               
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+LIBGOBLIN_OBJINFO_POSTPROC_EXTERN
+int
+       ObjectInfo_PostProc(
+               LibGoblin_ProgramInfo   *p_pginfo,
+               LibGoblin_BinaryInfo    *p_binfo )
+{
+       int             i_result;
+       LibGoblin_ObjectInfo    *pobj_now;
+
+       pobj_now        = p_pginfo->objinfo.p_objinfo;
+
+       if( NULL == pobj_now )
+               { goto goto_ObjectInfo_PostProc_post; }
+
+       do      {
+               // Resolv from address link in .debug_info to ObjectInfo IDs.---
+               i_result        = ObjectInfo_PostProc_ResolvTypeLink(
+                                                                               p_pginfo, p_binfo, pobj_now );
+       
+               // Regist Address INDEX table ---
+
+               // Regist Name INDEX table ---
+
+
+               pobj_now        = ((NO_OBJ == pobj_now->addrlink.i_next_id) ? NULL
+                                               : OBJINFO( p_pginfo, pobj_now->addrlink.i_next_id ));
+       }while( NULL != pobj_now );
+
+       // Sort Address INDEX table ---
+
+       // Sort Name INDEX table ---
+
+goto_ObjectInfo_PostProc_post:
+
+       return 0x00;
+}
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+
+
+
+/* EOF of drd64_.c ----------------------------------- */
diff --git a/libgoblin/drd64_libgoblin_objinfo_postproc.h b/libgoblin/drd64_libgoblin_objinfo_postproc.h
new file mode 100644 (file)
index 0000000..8cd505d
--- /dev/null
@@ -0,0 +1,56 @@
+/*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_OBJINFO_POSTPROC
+#define DRD64_HEADER_LIBGOBLIN_OBJINFO_POSTPROC
+
+#include"drd64_libgoblin.h"
+
+#ifdef DRD64_SRC_LIBGOBLIN_OBJINFO_POSTPROC
+       #define LIBGOBLIN_OBJINFO_POSTPROC_EXTERN
+#else
+       #define LIBGOBLIN_OBJINFO_POSTPROC_EXTERN       extern
+#endif
+
+LIBGOBLIN_OBJINFO_POSTPROC_EXTERN
+       int ObjectInfo_PostProc(
+                       LibGoblin_ProgramInfo *p_pginfo,
+                       LibGoblin_BinaryInfo *p_binfo );
+
+
+#endif /* DRD64_HEADER_LIBGOBLIN_BINFO */
+
+/* EOF of drd64_.h ----------------------------------- */
index 72a6a93..a08f7e9 100644 (file)
@@ -39,11 +39,12 @@ Comment:
 
 
 /*=====================================================================*/
+/*
 typedef union  {
        int             i_obj_id;
        Byte    *pb_info;
 } LibGoblin_ObjInfo_Link;
-
+*/
 
 /*=====================================================================*/
 typedef        struct  {
@@ -200,9 +201,9 @@ typedef     struct  {
                        Byte    b_bit_offset;
                        Byte    b_bit_size;
                        Byte    b_endianity;
-                       LibGoblin_ObjInfo_Link          t_link;
+                       int             i_objid_type;
+                       Byte    *p_dwtype;
                } type;
-
        } info;
 
        struct  {