OSDN Git Service

2019/03/25(Mon) 05:39
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sun, 24 Mar 2019 20:39:05 +0000 (05:39 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sun, 24 Mar 2019 20:39:05 +0000 (05:39 +0900)
 (LibGoblin)
  * Correct: Duplicate-Create BinaryInfo.

libgoblin/drd64_libgoblin_binfo.c
libgoblin/drd64_libgoblin_binfo.h
libgoblin/drd64_libgoblin_elf.c
libgoblin/drd64_libgoblin_elf_dynamic.c
libgoblin/drd64_libgoblin_elf_dynamic.h
libgoblin/drd64_libgoblin_proginfo.c

index 1ed3a85..c9b327f 100644 (file)
@@ -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 )
index dd64ab9..7b48a26 100644 (file)
@@ -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 );
index 3afcb84..e3cbf23 100644 (file)
@@ -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. */
index 26ea19a..9bc6b4b 100644 (file)
@@ -283,7 +283,7 @@ void
 ----------------------------------------------------------------------*/
 LIBGOBLIN_ELF_DYNAMIC_EXTERN
 int
-       LibGoblin_Elf_Dynamic_ReadDynamicSection(
+       ELF_Dynamic_ReadDynamicSection(
                LibGoblin_BinaryInfo    *p_binfo )
 {
        Byte                                    *pb_data;
index 4bbd06b..12cb214 100644 (file)
@@ -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 );
 
 
index 2ef4499..3afd6b2 100644 (file)
@@ -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;
 }