OSDN Git Service

2019/04/03(Wed) 05:38
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Tue, 2 Apr 2019 20:38:10 +0000 (05:38 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Tue, 2 Apr 2019 20:38:10 +0000 (05:38 +0900)
 (LibGoblin)
  * WorkBackup

include/libgoblin.h
libgoblin/drd64_libgoblin_api.c
libgoblin/drd64_libgoblin_elf_dynsym.c
libgoblin/drd64_libgoblin_objinfo.c
libgoblin/drd64_libgoblin_objinfo.h
libgoblin/test_libgoblin_loadprog.c

index 1fbd7e3..d80776a 100644 (file)
@@ -65,6 +65,8 @@ typedef struct        {
 LIBGOBLIN_API
        int LibGoblin_AnalyzeMainProgram( int i_pgid );
 LIBGOBLIN_API
+       int LibGoblin_AnalyzeLibrary( int i_pgid, int i_bid, PtrValue ptr_loadaddr );
+LIBGOBLIN_API
        int LibGoblin_GetUnresolv_ObjectFilePath( int i_pgid, LibGoblin_ObjectFilePath *p_objpath );
 LIBGOBLIN_API
        int LibGoblin_SetPathAndLoad_ObjectFilePath( LibGoblin_ObjectFilePath *p_objpath );
index 2ae1b92..0ea47a3 100644 (file)
@@ -72,6 +72,36 @@ int
 ***********************************************************************/
 LIBGOBLIN_API
 int
+       LibGoblin_AnalyzeLibrary(
+               int             i_pgid,
+               int             i_bid,
+               PtrValue        ptr_loadaddr )
+{
+       int             i_result;
+       LibGoblin_BinaryInfo    *p_binfo;
+
+       p_binfo = BinaryInfo_GetBinInfo( i_bid );
+       if( NULL == p_binfo )   {
+               return -0x01;
+       }
+
+       if( p_binfo->i_pginfo != i_pgid )       {
+               return -0x02;
+       }
+
+       i_result        = ELF_ReadELF_Phase2( p_binfo, ptr_loadaddr );
+       if( 0x00 != i_result )  {
+               return -0x03;
+       }
+
+       return  i_result;
+}
+
+
+/***********************************************************************
+***********************************************************************/
+LIBGOBLIN_API
+int
        LibGoblin_GetUnresolv_ObjectFilePath(
                int             i_pgid,
                LibGoblin_ObjectFilePath *p_objpath )
index 4abf3a6..c5c062f 100644 (file)
@@ -187,7 +187,8 @@ int
 
                if( 0x00000000 < ptr_addr )     {
                        ptr_addr        += p_binfo->ptr_loadbase;
-                       p_obj   = ObjectInfo_SearchDynamicSymbol( p_pginfo, ptr_addr, pstr_symname );
+                       p_obj   = ObjectInfo_SearchDynamicSymbol(
+                                                               p_pginfo, ptr_addr, pstr_symname, OBJINFO_STATUS_DYNAMIC );
                        // If the target program is stripped, p_obj = NULL because don't exist .symtab section.
                        if( NULL == p_obj )     {
                                p_obj   = ELF64_Symtab_RegistSymbol_toObjectInfo(
index 5a3cf67..93a07d0 100644 (file)
@@ -326,7 +326,8 @@ LibGoblin_ObjectInfo *
        ObjectInfo_SearchDynamicSymbol(
                        LibGoblin_ProgramInfo   *p_pginfo,
                        PtrValue                                ptr_value,
-                       char                                    *pstr_symname )
+                       char                                    *pstr_symname,
+                       DWord                                   dw_status )
 {
        LibGoblin_ObjectInfo    *p_objnow;
        LibGoblin_ObjectInfo    *p_objret       = NULL;
@@ -347,8 +348,8 @@ LibGoblin_ObjectInfo *
                if( p_objnow->addr.ptr_addr.value > ptr_value )
                        { break; }
                else if( p_objnow->addr.ptr_addr.value == ptr_value )   {
-                       if( p_objnow->dw_status & OBJINFO_STATUS_DYNAMIC )      {
-                               if( dw_hash == p_objnow->dw_hash )      {
+                       if( dw_hash == p_objnow->dw_hash )      {
+                               if(( 0x00 == dw_status ) || ( p_objnow->dw_status & dw_status ))        {
                                        if( !strncmp( pstr_symname, p_objnow->pstr_name, 256 ) )        {
                                                p_objret        = p_objnow;
                                                break;
index 0d783db..5aad428 100644 (file)
@@ -76,7 +76,7 @@ LIBGOBLIN_OBJINFO_EXTERN
                        LibGoblin_ProgramInfo *p_pginfo, PtrValue ptr_value, QWord qw_size );
 LIBGOBLIN_OBJINFO_EXTERN
        LibGoblin_ObjectInfo *ObjectInfo_SearchDynamicSymbol(
-                       LibGoblin_ProgramInfo *p_pginfo, PtrValue ptr_value, char *pstr_symname );
+                       LibGoblin_ProgramInfo *p_pginfo, PtrValue ptr_value, char *pstr_symname, DWord dw_status );
 LIBGOBLIN_OBJINFO_EXTERN
        int ObjectInfo_FreeObjectInfo( LibGoblin_ProgramInfo *p_pginfo, LibGoblin_ObjectInfo *p_binfo );
 LIBGOBLIN_OBJINFO_EXTERN
index 0188b8d..f335ac7 100644 (file)
@@ -101,6 +101,9 @@ void Test_LibGoblin_LoadProg_API_LoadProgram_test00_001( void )
        i_result        = LibGoblin_AnalyzeMainProgram( i_pgid );
        CU_ASSERT( 0x00 == i_result );
 
+       //i_result      = LibGoblin_AnalyzeLibrary( i_pgid, i_bid[2], 0x80000000 );
+       //CU_ASSERT( 0x00 == i_result );
+
        i_result        = LibGoblin_FreeProgInfo( i_pgid );
        CU_ASSERT( 0x00 == i_result );