From d1556351f488c60a678c52a578aa88fef5926482 Mon Sep 17 00:00:00 2001 From: "Koine Yuusuke(koinec)" Date: Mon, 25 Mar 2019 05:39:05 +0900 Subject: [PATCH] 2019/03/25(Mon) 05:39 (LibGoblin) * Correct: Duplicate-Create BinaryInfo. --- libgoblin/drd64_libgoblin_binfo.c | 38 +++++++++++++++++++++++++++++++++ libgoblin/drd64_libgoblin_binfo.h | 2 ++ libgoblin/drd64_libgoblin_elf.c | 4 ++-- libgoblin/drd64_libgoblin_elf_dynamic.c | 2 +- libgoblin/drd64_libgoblin_elf_dynamic.h | 2 +- libgoblin/drd64_libgoblin_proginfo.c | 19 +++++++++++------ 6 files changed, 57 insertions(+), 10 deletions(-) diff --git a/libgoblin/drd64_libgoblin_binfo.c b/libgoblin/drd64_libgoblin_binfo.c index 1ed3a85..c9b327f 100644 --- a/libgoblin/drd64_libgoblin_binfo.c +++ b/libgoblin/drd64_libgoblin_binfo.c @@ -129,6 +129,44 @@ void ----------------------------------------------------------------------*/ LIBGOBLIN_BINFO_EXTERN int + BinInfo_SearchFilename_inProgInfo( + char *pstr_libname, + LibGoblin_ProgramInfo *p_pginfo ) +{ + DWord dw_hash; + LibGoblin_BinaryInfo *p_binfo_top; + LibGoblin_BinaryInfo *p_binfo_now; + LibGoblin_BinaryInfo *p_binfo_ret; + + dw_hash = Common_CalcDJBhash( pstr_libname ); + + // Search Parent BinaryInfo --- + p_binfo_top = BINFO( p_pginfo->i_binfo_id ); + assert( NULL != p_binfo_top ); + + // Search & Get ChainEnd BinaryInfo --- + p_binfo_ret = NULL; + p_binfo_now = p_binfo_top; + do { + if( dw_hash == p_binfo_now->dw_hash ) { + if( !strncmp( p_binfo_now->str_filename, pstr_libname, DRD64_MAX_PATH ) ) { + p_binfo_ret = p_binfo_now; + break; + } + } + + p_binfo_now = ((-0x01 != p_binfo_now->i_binfo_next) + ? BINFO( p_binfo_now->i_binfo_next) : NULL); + } while( NULL != p_binfo_now ); + + return ((NULL != p_binfo_ret) ? p_binfo_ret->i_id : -0x01 ); +} + + +/*---------------------------------------------------------------------- +----------------------------------------------------------------------*/ +LIBGOBLIN_BINFO_EXTERN +int BinInfo_SearchFilename( char *pstr_libname, LibGoblin_BinaryInfo *p_binfo_self ) diff --git a/libgoblin/drd64_libgoblin_binfo.h b/libgoblin/drd64_libgoblin_binfo.h index dd64ab9..7b48a26 100644 --- a/libgoblin/drd64_libgoblin_binfo.h +++ b/libgoblin/drd64_libgoblin_binfo.h @@ -67,6 +67,8 @@ int gi_now_binary_info = 0; LIBGOBLIN_BINFO_EXTERN LibGoblin_BinaryInfo *BinaryInfo_GetBinInfo( int i_bid ); LIBGOBLIN_BINFO_EXTERN + int BinInfo_SearchFilename_inProgInfo( char *pstr_libname, LibGoblin_ProgramInfo *p_pginfo ); +LIBGOBLIN_BINFO_EXTERN int BinInfo_SearchFilename( char *pstr_libname, LibGoblin_BinaryInfo *p_binfo_self ); LIBGOBLIN_BINFO_EXTERN int BinInfo_SearchNextSlave( int i_bid_self, int i_bid_now ); diff --git a/libgoblin/drd64_libgoblin_elf.c b/libgoblin/drd64_libgoblin_elf.c index 3afcb84..e3cbf23 100644 --- a/libgoblin/drd64_libgoblin_elf.c +++ b/libgoblin/drd64_libgoblin_elf.c @@ -125,7 +125,7 @@ int else if( LIBGOBLIN_BINFO_TYPE_ELF32 == p_binfo->b_type ) { } - i_result = LibGoblin_Elf_Dynamic_ReadDynamicSection( p_binfo ); + i_result = ELF_Dynamic_ReadDynamicSection( p_binfo ); if( 0x00 > i_result ) { return -0x02; } @@ -182,7 +182,7 @@ int return i_result; } - Debug_ObjectInfo_Print_AllGroupLink( p_pginfo, 0xff ); + //Debug_ObjectInfo_Print_AllGroupLink( p_pginfo, 0xff ); /* Analyze Dwarf-Debug Info. */ diff --git a/libgoblin/drd64_libgoblin_elf_dynamic.c b/libgoblin/drd64_libgoblin_elf_dynamic.c index 26ea19a..9bc6b4b 100644 --- a/libgoblin/drd64_libgoblin_elf_dynamic.c +++ b/libgoblin/drd64_libgoblin_elf_dynamic.c @@ -283,7 +283,7 @@ void ----------------------------------------------------------------------*/ LIBGOBLIN_ELF_DYNAMIC_EXTERN int - LibGoblin_Elf_Dynamic_ReadDynamicSection( + ELF_Dynamic_ReadDynamicSection( LibGoblin_BinaryInfo *p_binfo ) { Byte *pb_data; diff --git a/libgoblin/drd64_libgoblin_elf_dynamic.h b/libgoblin/drd64_libgoblin_elf_dynamic.h index 4bbd06b..12cb214 100644 --- a/libgoblin/drd64_libgoblin_elf_dynamic.h +++ b/libgoblin/drd64_libgoblin_elf_dynamic.h @@ -47,7 +47,7 @@ Comment: LIBGOBLIN_ELF_DYNAMIC_EXTERN int ELF64_Dynamic_GetDynStrSection_fromProgHdr( LibGoblin_BinaryInfo *p_binfo ); LIBGOBLIN_ELF_DYNAMIC_EXTERN - int LibGoblin_Elf_Dynamic_ReadDynamicSection( + int ELF_Dynamic_ReadDynamicSection( LibGoblin_BinaryInfo *p_binfo ); diff --git a/libgoblin/drd64_libgoblin_proginfo.c b/libgoblin/drd64_libgoblin_proginfo.c index 2ef4499..3afd6b2 100644 --- a/libgoblin/drd64_libgoblin_proginfo.c +++ b/libgoblin/drd64_libgoblin_proginfo.c @@ -63,17 +63,24 @@ LibGoblin_BinaryInfo * const char *pstr_binfilename, int i_req_bid ) { + int i_bid; LibGoblin_BinaryInfo *p_binfo = NULL; assert( NULL != p_pginfo ); - // Alloc BinaryInfo --- - p_binfo = BinaryInfo_AllocBinInfo( p_pginfo, pstr_binfilename, i_req_bid ); - if( NULL == p_binfo ) { - return NULL; - } + i_bid = BinInfo_SearchFilename_inProgInfo( pstr_binfilename, p_pginfo ); + if( -0x01 == i_bid ) { + // Alloc BinaryInfo --- + p_binfo = BinaryInfo_AllocBinInfo( p_pginfo, pstr_binfilename, i_req_bid ); + if( NULL == p_binfo ) { + return NULL; + } - if( -1 == i_req_bid ) { p_pginfo->i_binfo_id = p_binfo->i_id; } + if( -1 == i_req_bid ) { p_pginfo->i_binfo_id = p_binfo->i_id; } + } + else { + p_binfo = BinaryInfo_GetBinInfo( i_bid ); + } return p_binfo; } -- 2.11.0