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 \
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 \
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
#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"
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!
{ 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 },
/*----------------------------------------------------------------------
+ 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
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; }
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,
/*----------------------------------------------------------------------
----------------------------------------------------------------------*/
#define FUNCID_LibGoblin_ObjectInfo_AdoptObjectInfo 0x23
+LIBGOBLIN_OBJINFO_EXTERN
int
ObjectInfo_AdoptObjectInfo(
LibGoblin_ProgramInfo *p_pginfo,
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
--- /dev/null
+/*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 ----------------------------------- */
--- /dev/null
+/*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 ----------------------------------- */
/*=====================================================================*/
+/*
typedef union {
int i_obj_id;
Byte *pb_info;
} LibGoblin_ObjInfo_Link;
-
+*/
/*=====================================================================*/
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 {