From 12925368dd33f7158edeb44e50f822d166dec0f8 Mon Sep 17 00:00:00 2001 From: "Koine Yuusuke(koinec)" Date: Mon, 7 Jan 2019 22:11:19 +0900 Subject: [PATCH] 2019/01/07(Mon) 22:12 (LibGoblin) * Implement: ObjectInfo_InsetObject Func. --- libgoblin/Makefile | 5 + libgoblin/drd64_libgoblin_objinfo.c | 98 +++++++++++++++-- libgoblin/drd64_libgoblin_type.h | 23 ++-- libgoblin/test_libgoblin.c | 1 + libgoblin/test_libgoblin.h | 7 ++ libgoblin/test_libgoblin_objinfo.c | 210 ++++++++++++++++++++++++++++++++++++ 6 files changed, 329 insertions(+), 15 deletions(-) create mode 100644 libgoblin/test_libgoblin_objinfo.c diff --git a/libgoblin/Makefile b/libgoblin/Makefile index 7fb166f..a30ece0 100644 --- a/libgoblin/Makefile +++ b/libgoblin/Makefile @@ -108,6 +108,7 @@ TEST_OBJS = test_libgoblin.o \ test_libgoblin_binaryfile.o \ test_libgoblin_loadprog.o \ test_libgoblin_binfo.o \ + test_libgoblin_objinfo.o \ test_libgoblin_readbin.o \ test_libgoblin_symwork.o @@ -212,6 +213,10 @@ test_libgoblin_binfo.o: test_libgoblin_binfo.c $(HEADER) $(TEST_HEADER) $(CC) -c -o test_libgoblin_binfo.o \ $(FLAGS_DEBUG) $(FLAGS_COMPILE) $(TEST_FLAGS_COMPILE) \ test_libgoblin_binfo.c +test_libgoblin_objinfo.o: test_libgoblin_objinfo.c $(HEADER) $(TEST_HEADER) + $(CC) -c -o test_libgoblin_objinfo.o \ + $(FLAGS_DEBUG) $(FLAGS_COMPILE) $(TEST_FLAGS_COMPILE) \ + test_libgoblin_objinfo.c test_libgoblin_proginfo.o: test_libgoblin_proginfo.c $(HEADER) $(TEST_HEADER) $(CC) -c -o test_libgoblin_proginfo.o \ $(FLAGS_DEBUG) $(FLAGS_COMPILE) $(TEST_FLAGS_COMPILE) \ diff --git a/libgoblin/drd64_libgoblin_objinfo.c b/libgoblin/drd64_libgoblin_objinfo.c index 79fb08a..f342c63 100644 --- a/libgoblin/drd64_libgoblin_objinfo.c +++ b/libgoblin/drd64_libgoblin_objinfo.c @@ -67,6 +67,11 @@ void p_objinfo->i_id = -0x01; + p_objinfo->grplink.i_parent_id = -0x01; + p_objinfo->grplink.i_child_topid = -0x01; + p_objinfo->addrlink.i_next_id = -0x01; + p_objinfo->addrlink.i_prev_id = -0x01; + return; } @@ -144,34 +149,103 @@ LibGoblin_ObjectInfo * ----------------------------------------------------------------------*/ LIBGOBLIN_OBJINFO_EXTERN LibGoblin_ObjectInfo * - ObjectInfo_AllocStaticObject( + ObjectInfo_InsetObject( LibGoblin_ProgramInfo *p_pginfo, Ptr ptr_address, - QWord qw_size ) + QWord qw_size, + LibGoblin_ObjectInfo *p_parent, + Byte b_flag_child ) { LibGoblin_ObjectInfo *p_objinfo; LibGoblin_ObjectInfo *p_objnow; + LibGoblin_ObjectInfo *p_objprev; + LibGoblin_ObjectInfo *p_objover; + QWord qw_range; + // Alloc ObjectInfo --- p_objinfo = ObjectInfo_AllocObjectInfo( p_pginfo ); - if( NULL == p_objinfo ) - { goto goto_ObjectInfo_AllocStaticObject_post; } + if( NULL == p_objinfo ) { + goto goto_ObjectInfo_InsetObject_post; + } + ObjectInfo_ClearObjectInfo( p_objinfo ); + // Ptn1: First ObjectInfo --- + // ( ProgramInfo->i_top_objinfo == -0x01 ) + // & ( p_parent == NULL ) if( -0x01 == p_pginfo->i_top_objinfo ) { + assert( NULL == p_parent ); p_pginfo->i_top_objinfo = p_objinfo->i_id; - goto goto_ObjectInfo_AllocStaticObject_post; + goto goto_ObjectInfo_InsetObject_post; } p_objnow = OBJINFO( p_pginfo, p_pginfo->i_top_objinfo ); assert( NULL != p_objnow ); - /// XXX 2018/11/27 + qw_range = 0xffffffffffffffff; + p_objover = NULL; + p_objprev = NULL; do { + if(( p_objnow->ptr_address <= ptr_address ) + && ( (ptr_address + qw_size) <= (p_objnow->ptr_address + p_objnow->qw_size) )) { + if( p_objnow->qw_size <= qw_range ) { + p_objover = p_objnow; + qw_range = p_objnow->qw_size; + } + } + if( ptr_address == p_objnow->ptr_address ) { + if( qw_size > p_objnow->qw_size ) { break; } + } + else if( ptr_address < p_objnow->ptr_address ) { break; } + + p_objprev = p_objnow; + p_objnow = ((-0x01 != p_objnow->addrlink.i_next_id) + ? OBJINFO( p_pginfo, p_objnow->addrlink.i_next_id ) : NULL ); + }while( NULL != p_objnow ); + + // Link Address Order --- + p_objinfo->addrlink.i_next_id = ((NULL != p_objnow) ? p_objnow->i_id : -0x01); + p_objinfo->addrlink.i_prev_id = ((NULL != p_objprev) ? p_objprev->i_id : -0x01); + + if( NULL != p_objprev ) { p_objprev->addrlink.i_next_id = p_objinfo->i_id; } + if( NULL != p_objnow ) { p_objnow->addrlink.i_prev_id = p_objinfo->i_id; } + + // Link Family Order --- + if( NULL == p_parent ) { + if( 0x00 != b_flag_child ) { + if( NULL != p_objover ) { p_parent = p_objover; } + } + } - }while( -0x01 == p_objnow->i_next_id ); + if( NULL != p_parent ) { + if( -0x01 == p_parent->grplink.i_child_topid ) { + p_parent->grplink.i_child_topid = p_objinfo->i_id; + p_objinfo->grplink.i_parent_id = p_parent->i_id; + } + else { + p_objnow = ((-0x01 != p_parent->grplink.i_child_topid) + ? OBJINFO( p_pginfo, p_parent->grplink.i_child_topid ) : NULL ); + p_objprev = NULL; + do { + if( ptr_address == p_objnow->ptr_address ) { + if( qw_size > p_objnow->qw_size ) { break; } + } + else if( ptr_address < p_objnow->ptr_address ) { break; } + + p_objprev = p_objnow; + p_objnow = ((-0x01 != p_objnow->grplink.i_next_id) + ? OBJINFO( p_pginfo, p_objnow->grplink.i_next_id ) : NULL ); + }while( NULL != p_objnow ); + p_objinfo->grplink.i_next_id = ((NULL != p_objnow) ? p_objnow->i_id : -0x01); + p_objinfo->grplink.i_prev_id = ((NULL != p_objprev) ? p_objprev->i_id : -0x01); + + if( NULL != p_objprev ) { p_objprev->grplink.i_next_id = p_objinfo->i_id; } + if( NULL != p_objnow ) { p_objnow->grplink.i_prev_id = p_objinfo->i_id; } + } + } -goto_ObjectInfo_AllocStaticObject_post: +goto_ObjectInfo_InsetObject_post: return p_objinfo; } @@ -205,7 +279,13 @@ int assert( NULL != p_pginfo ); - if( NULL == p_objinfo ) { return 0x01; } + if( NULL == p_objinfo ) { + return 0x01; + } + + if( -0x01 == p_objinfo->i_id ) { + return 0x02; + } i_objid = p_objinfo->i_id; ObjectInfo_ClearObjectInfo( p_objinfo ); diff --git a/libgoblin/drd64_libgoblin_type.h b/libgoblin/drd64_libgoblin_type.h index 4a356bc..71a3203 100644 --- a/libgoblin/drd64_libgoblin_type.h +++ b/libgoblin/drd64_libgoblin_type.h @@ -64,18 +64,29 @@ typedef struct { typedef struct { int i_id; + // Group(Parent-Child) Order Link --- + struct { + int i_parent_id; // Parent ObjectInfo + int i_child_topid; // Child Top ObjectInfo + int i_next_id; // Next + int i_prev_id; + } grplink; + + // Address Order Link --- + struct { + int i_next_id; // Next Address ObjectInfo + int i_prev_id; // Prev Address ObjectInfo + } addrlink; + + // Address & Memory-Range Info ---- Ptr ptr_address; // Object Address - DWord dw_size; // Object Size (Address Range) + QWord qw_size; // Object Size (Address Range) + char *pstr_name; // Object Name (Param./Func./etc...) //DWord dw_srcid; // SourceInfo struct ID Byte b_elf_flags; Word w_secid; // SectionInfo ItemIndex belong with this object. - int i_dynamic_id; // Child-Top ObjectInfo (use only Dynamic Mode) - int i_parent_id; // Parent ObjectInfo - int i_next_id; // Next Address ObjectInfo - int i_prev_id; // Prev Address ObjectInfo - } LibGoblin_ObjectInfo; diff --git a/libgoblin/test_libgoblin.c b/libgoblin/test_libgoblin.c index 2cc2d45..afad1c3 100644 --- a/libgoblin/test_libgoblin.c +++ b/libgoblin/test_libgoblin.c @@ -53,6 +53,7 @@ int Test_LibGoblin_BinInfo(); Test_LibGoblin_ProgInfo(); Test_LibGoblin_BinaryFile(); + Test_LibGoblin_ObjInfo(); Test_LibGoblin_SymWork(); Test_LibGoblin_ReadBinary(); Test_LibGoblin_LoadProg(); diff --git a/libgoblin/test_libgoblin.h b/libgoblin/test_libgoblin.h index ff1f6fc..2974623 100644 --- a/libgoblin/test_libgoblin.h +++ b/libgoblin/test_libgoblin.h @@ -56,6 +56,13 @@ DRD64_TEST_LIBGOBLIN_SYSTEM_EXTERN int Test_LibGoblin_System( void ); #endif DRD64_TEST_LIBGOBLIN_BINFO_EXTERN int Test_LibGoblin_BinInfo( void ); +#ifdef DRD64_SRC_TEST_LIBGOBLIN_OBJINFO + #define DRD64_TEST_LIBGOBLIN_OBJINFO_EXTERN +#else + #define DRD64_TEST_LIBGOBLIN_OBJINFO_EXTERN extern +#endif +DRD64_TEST_LIBGOBLIN_OBJINFO_EXTERN int Test_LibGoblin_ObjInfo( void ); + #ifdef DRD64_SRC_TEST_LIBGOBLIN_PROGINFO #define DRD64_TEST_LIBGOBLIN_PROGINFO_EXTERN #else diff --git a/libgoblin/test_libgoblin_objinfo.c b/libgoblin/test_libgoblin_objinfo.c new file mode 100644 index 0000000..69d344e --- /dev/null +++ b/libgoblin/test_libgoblin_objinfo.c @@ -0,0 +1,210 @@ +/*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_TEST_LIBGOBLIN_OBJINFO +#include"drd64_libgoblin.h" +#include"test_libgoblin.h" + + +/* BinaryInfo_AllocBinInfo() & FreeBinInfo() **************************/ +/*--------------------------------------------------------------------*/ +void Test_ObjectInfo_AllocFree_test00_001( void ) +{ + int i_result; + int i_cnt; + int i_max; + LibGoblin_ProgramInfo *p_pginfo; + LibGoblin_BinaryInfo *p_binfo; + LibGoblin_ObjectInfo *p_objinfo; + + // Init ---- + i_result = ProgInfo_Init(); + CU_ASSERT( 0x00 == i_result ); + + p_pginfo = ProgInfo_AllocProgInfo(); + CU_ASSERT( NULL != p_pginfo ); + + i_result = ObjectInfo_Init( p_pginfo, 0 ); + CU_ASSERT( 0x00 == i_result ); + + // Alloc Test --- + i_max = (LIBGOBLIN_OBJINFO_UNITS * LIBGOBLIN_OBJINFO_INITALLOCRATE) + 1; + for( i_cnt = 0; i_cnt <= i_max; i_cnt++ ) { + p_objinfo = ObjectInfo_AllocObjectInfo( p_pginfo ); + CU_ASSERT( NULL != p_objinfo ); + CU_ASSERT( p_objinfo->i_id == i_cnt ); + } + + for( i_cnt = (i_max / 2); i_cnt >= 0; i_cnt-- ) { + p_objinfo = ObjectInfo_GetObjectInfo( p_pginfo, i_cnt ); + CU_ASSERT( NULL != p_objinfo ); + + i_result = ObjectInfo_FreeObjectInfo( p_pginfo, p_objinfo ); + CU_ASSERT( 0x00 == i_result ); + } + + for( i_cnt = 0; i_cnt <= (i_max/2); i_cnt++ ) { + p_objinfo = ObjectInfo_AllocObjectInfo( p_pginfo ); + CU_ASSERT( NULL != p_objinfo ); + CU_ASSERT( p_objinfo->i_id == i_cnt ); + } + + for( i_cnt = i_max; i_cnt >= 0; i_cnt-- ) { + p_objinfo = ObjectInfo_GetObjectInfo( p_pginfo, i_cnt ); + CU_ASSERT( NULL != p_objinfo ); + + i_result = ObjectInfo_FreeObjectInfo( p_pginfo, p_objinfo ); + CU_ASSERT( 0x00 == i_result ); + } + + // Term --- + i_result = ObjectInfo_Term( p_pginfo ); + CU_ASSERT( 0x00 == i_result ); + + i_result = ProgInfo_FreeProgInfo( p_pginfo ); + CU_ASSERT( 0x00 == i_result ); + + i_result = ProgInfo_Term(); + CU_ASSERT( 0x00 == i_result ); + + + return; +} + + +/*--------------------------------------------------------------------*/ +void Test_ObjectInfo_AllocFree_test00_002( void ) +{ +/* + int i_result; + int i_cnt; + int i_parent_bid; + char str_fname[50]; + LibGoblin_ProgramInfo *p_pginfo; + LibGoblin_BinaryInfo *p_binfo; + + i_result = ProgInfo_Init(); + CU_ASSERT( 0x00 == i_result ); + + i_result = BinaryInfo_Init(); + CU_ASSERT( 0x00 == i_result ); + + p_pginfo = ProgInfo_AllocProgInfo(); + CU_ASSERT( NULL != p_pginfo ); + + p_binfo = BinaryInfo_AllocBinInfo( p_pginfo, "testprog", -1 ); + CU_ASSERT( NULL != p_binfo ); + CU_ASSERT( 0 == p_binfo->i_id ); + i_parent_bid = p_binfo->i_id; + + for( i_cnt = 1; i_cnt < (8 * 8); i_cnt++ ) { + sprintf( str_fname, "file%02d", i_cnt ); + p_binfo = BinaryInfo_AllocBinInfo( p_pginfo, str_fname, i_parent_bid ); + CU_ASSERT( NULL != p_binfo ); + CU_ASSERT( i_cnt == p_binfo->i_id ); + + //printf(" debug: %p (%02d)\n", p_binfo, p_binfo->i_id ); + } + + for( i_cnt = (8 * 8); i_cnt > 0; i_cnt-- ) { + p_binfo = BinaryInfo_GetBinInfo( i_cnt - 1 ); + i_result = BinaryInfo_FreeBinInfo( p_binfo ); + CU_ASSERT( 0x00 == i_result ); + } + + i_result = ProgInfo_FreeProgInfo( p_pginfo ); + CU_ASSERT( 0x00 == i_result ); + + i_result = BinaryInfo_Term(); + CU_ASSERT( 0x00 == i_result ); + + i_result = ProgInfo_Term(); + CU_ASSERT( 0x00 == i_result ); +*/ + return; +} + + +/* ObjectInfo_Init() & Term() *****************************************/ +/*--------------------------------------------------------------------*/ +void Test_ObjectInfo_InitTerm_test00_001( void ) +{ + int i_result; + LibGoblin_ProgramInfo *p_pginfo; + LibGoblin_BinaryInfo *p_binfo; + + i_result = ProgInfo_Init(); + CU_ASSERT( 0x00 == i_result ); + + p_pginfo = ProgInfo_AllocProgInfo(); + CU_ASSERT( NULL != p_pginfo ); + + i_result = ObjectInfo_Init( p_pginfo, 0 ); + CU_ASSERT( 0x00 == i_result ); + + i_result = ObjectInfo_Term( p_pginfo ); + CU_ASSERT( 0x00 == i_result ); + + i_result = ProgInfo_FreeProgInfo( p_pginfo ); + CU_ASSERT( 0x00 == i_result ); + + i_result = ProgInfo_Term(); + CU_ASSERT( 0x00 == i_result ); + + return; +} + + +/*---------------------------------------------------------------------- +----------------------------------------------------------------------*/ +DRD64_TEST_LIBGOBLIN_OBJINFO_EXTERN +int + Test_LibGoblin_ObjInfo( + void ) +{ + CU_pSuite pt_goblin; + + pt_goblin = CU_add_suite( "LibGoblin_ObjInfo", NULL, NULL ); + CU_add_test( pt_goblin, "ObjectInfo_InitTerm_test00_001", + Test_ObjectInfo_InitTerm_test00_001 ); + CU_add_test( pt_goblin, "ObjectInfo_AllocFree_test00_001", + Test_ObjectInfo_AllocFree_test00_001 ); + + return 0x00; +} + + +/* EOF of drd64_.c ----------------------------------- */ -- 2.11.0