OSDN Git Service

2019/03/10(Sun) 20:36
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sun, 10 Mar 2019 11:36:35 +0000 (20:36 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sun, 10 Mar 2019 11:36:35 +0000 (20:36 +0900)
 (LibGoblin)
  * WorkBackup

libgoblin/drd64_libgoblin_elf_dynsym.c
libgoblin/drd64_libgoblin_elf_symtab.c
libgoblin/drd64_libgoblin_elf_symtab.h
libgoblin/drd64_libgoblin_objinfo.c
libgoblin/drd64_libgoblin_objinfo.h
libgoblin/drd64_libgoblin_type.h

index b76e69d..aa478bf 100644 (file)
@@ -154,16 +154,22 @@ int
                }
        printf(" debug: [%2u] %s (%s) = %d\n", dw_sym, pstr_symname, p_binlib->str_filename, i_result );
                
+               if( 0 > i_result )      { continue; }
 
+               p_obj   = ObjectInfo_SearchDynamicSymbol( p_pginfo, (PtrValue)p_sym->st_value, pstr_symname );
+               if( NULL == p_obj )     {
+               // st_value - Symbol value.
+               // st_size - Size of associated object.
+                       p_obj   = ObjectInfo_InsetObject( p_pginfo,
+                                                       (PtrValue)p_sym->st_value, (QWord)p_sym->st_size, NULL, 0x01 );
+               }
+
+               assert( NULL != p_obj );
 
                // 2019/03/05 -- TODO
                // Set Info. for ObjectInfo
 
                /*
-       // st_value - Symbol value.
-       // st_size - Size of associated object.
-               p_obj   = ObjectInfo_InsetObject( p_pginfo,
-                                                       (PtrValue)p_sym->st_value, (QWord)p_sym->st_size, NULL, 0x01 );
 
        // st_name - String table index of name.
                p_obj->pstr_name        = (char *)(pb_strtab + p_sym->st_name);
index 2086850..b2b6fd2 100644 (file)
@@ -41,6 +41,80 @@ Comment:
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
 LIBGOBLIN_ELF_SYMTAB_EXTERN
+LibGoblin_ObjectInfo *
+       ELF64_Symtab_RegistSymbol_toObjectInfo(
+                       LibGoblin_ProgramInfo   *p_pginfo,
+                       Elf64_Sym       *p_sym,
+                       Byte            *pb_strtab )
+{
+       LibGoblin_SrcFile               *p_srcfile;
+       LibGoblin_ObjectInfo    *p_obj  = NULL;
+       
+       if(( 0x00000000 == p_sym->st_value )
+                       && ( STT_NOTYPE == ELF64_ST_TYPE( p_sym->st_info ) ))
+               { goto  goto_ELF64_Symtab_RegistSymbol_toObjectInfo_post; }
+
+       // Source file.
+       if( STT_FILE == ELF64_ST_TYPE( p_sym->st_info ) )       {
+               p_srcfile       = SrcFile_DispenseSrcFile( (char *)pb_strtab + p_sym->st_name );
+               assert( NULL != p_srcfile );
+               goto    goto_ELF64_Symtab_RegistSymbol_toObjectInfo_post;
+       }
+
+
+       // st_value - Symbol value.
+       // st_size - Size of associated object.
+       p_obj   = ObjectInfo_InsetObject( p_pginfo,
+                                                       (PtrValue)p_sym->st_value, (QWord)p_sym->st_size, NULL, 0x01 );
+
+       // st_name - String table index of name.
+       p_obj->pstr_name        = (char *)(pb_strtab + p_sym->st_name);
+       p_obj->dw_hash          = Common_CalcDJBhash( (char *)(pb_strtab + p_sym->st_name) );
+
+       // st_info - Type and binding information.
+       p_obj->info.symbol.b_type       = ELF64_ST_TYPE( p_sym->st_info );
+       switch( ELF64_ST_TYPE( p_sym->st_info ) )       {
+               // Unspecified type.
+               case STT_NOTYPE:
+                       p_obj->b_type   = OBJINFO_TYPE_NULL;            break;
+               // Data object.
+               case STT_OBJECT:
+                       p_obj->b_type   = OBJINFO_TYPE_OBJECT;          break;
+               // Function.
+               case STT_FUNC:
+                       p_obj->b_type   = OBJINFO_TYPE_FUNCTION;        break;
+               // Section.
+               case STT_SECTION:
+                       p_obj->b_type   = OBJINFO_TYPE_SECTION;         break;
+               // Uninitialized common block.
+               case STT_COMMON:
+                       p_obj->b_type   = OBJINFO_TYPE_COMMON;          break;
+               // TLS object.
+               case STT_TLS:
+                       p_obj->b_type   = OBJINFO_TYPE_TLS;             break;
+               default:
+                       p_obj->b_type   = OBJINFO_TYPE_NULL;            break;
+       }
+
+       // st_info - Type and binding information.
+       p_obj->info.symbol.b_binding    = ELF64_ST_BIND( p_sym->st_info );
+
+       // st_other - Reserved (not used).
+       p_obj->info.symbol.b_visibility = p_sym->st_other;
+
+       // st_shndx - Section index of symbol.
+       p_obj->info.symbol.w_secindex   = p_sym->st_shndx;
+       if(( SHN_UNDEF == p_sym->st_shndx ) && ( STT_NOTYPE != ELF64_ST_TYPE( p_sym->st_info ) ))
+               { p_obj->b_status       |=      OBJINFO_STATUS_DYNAMIC; }
+
+goto_ELF64_Symtab_RegistSymbol_toObjectInfo_post:
+       return  p_obj;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+LIBGOBLIN_ELF_SYMTAB_EXTERN
 int
        ELF64_Symtab_ReadSection(
                        LibGoblin_BinaryInfo    *p_binfo )
@@ -89,7 +163,8 @@ int
 
        p_sym   = (Elf64_Sym *)pb_symtab;
        for( dw_cnt = 0; ((dw_cnt < dw_symbols) && (0x00 == i_result)); dw_cnt++, p_sym++ )     {
-
+               ELF64_Symtab_RegistSymbol_toObjectInfo( p_pginfo, p_sym, pb_strtab );
+/*
                // Source file.
                if( STT_FILE == ELF64_ST_TYPE( p_sym->st_info ) )       {
                        p_srcfile       = SrcFile_DispenseSrcFile( (char *)pb_strtab + p_sym->st_name );
@@ -143,6 +218,9 @@ int
 
                // st_shndx - Section index of symbol.
                p_obj->info.symbol.w_secindex   = p_sym->st_shndx;
+               if(( SHN_UNDEF == p_sym->st_shndx ) && ( STT_NOTYPE != ELF64_ST_TYPE( p_sym->st_info ) ))
+                       { p_obj->b_status       |=      OBJINFO_STATUS_DYNAMIC; }
+*/
        }
 
        if( 0x00 != i_result )  {
index 03b3fd0..86112e9 100644 (file)
@@ -49,7 +49,9 @@ Comment:
 #ifdef DRD64_SRC_LIBGOBLIN_ELF_SYMTAB
 #endif
 
-
+LIBGOBLIN_ELF_SYMTAB_EXTERN
+       LibGoblin_ObjectInfo *ELF64_Symtab_RegistSymbol_toObjectInfo(
+                       LibGoblin_ProgramInfo *p_pginfo, Elf64_Sym *p_sym, Byte *pb_strtab );
 LIBGOBLIN_ELF_SYMTAB_EXTERN
        int ELF64_Symtab_ReadSection(
                        LibGoblin_BinaryInfo    *p_binfo );
index f7f90eb..94845ae 100644 (file)
@@ -70,7 +70,7 @@ void
        memset( p_objinfo, 0x00, sizeof( LibGoblin_ObjectInfo ) );
 
        p_objinfo->i_id         = i_id;
-       p_objinfo->b_status     = LIBGOBLIN_OBJINFO_INVALID;
+       p_objinfo->b_status     = OBJINFO_STATUS_INVALID;
 
        p_objinfo->grplink.i_parent_id          = NO_OBJ;
        p_objinfo->grplink.i_child_topid        = NO_OBJ;
@@ -135,7 +135,7 @@ LibGoblin_ObjectInfo *
        p_pginfo->objinfo.i_empty       = p_objinfo->grplink.i_next_id;
        ObjectInfo_ClearObjectInfo( p_objinfo );
 
-       p_objinfo->b_status                     = LIBGOBLIN_OBJINFO_VALID;
+       p_objinfo->b_status                     = OBJINFO_STATUS_VALID;
        p_pginfo->objinfo.i_used++;
 
        return p_objinfo;
@@ -281,41 +281,36 @@ goto_ObjectInfo_InsetObject_post:
 ----------------------------------------------------------------------*/
 LIBGOBLIN_OBJINFO_EXTERN
 LibGoblin_ObjectInfo *
-       ObjectInfo_SearchDynamicFunction(
+       ObjectInfo_SearchDynamicSymbol(
                        LibGoblin_ProgramInfo   *p_pginfo,
                        PtrValue                                ptr_value,
-                       QWord                                   qw_size,
-                       char                                    *pstr_dynsym_name,
-                       char                                    *pstr_vername )
+                       char                                    *pstr_symname )
 {
        LibGoblin_ObjectInfo    *p_objnow;
        LibGoblin_ObjectInfo    *p_objret       = NULL;
-       char    str_linkname[256];
+       DWord                                   dw_hash;
 
        // Check exist MasterObject ---
        if( NO_OBJ == p_pginfo->objinfo.i_topid )
-               { goto  goto_ObjectInfo_SearchDynamicFunction_post; }
+               { goto  goto_ObjectInfo_SearchDynamicSymbol_post; }
 
 
        // Search ObjectInfo Inset Location. (Address Order)---
        p_objnow        = OBJINFO( p_pginfo, p_pginfo->objinfo.i_topid );
        assert( NULL != p_objnow );
 
+       dw_hash = Common_CalcDJBhash( pstr_symname );
+
        do      {
                if( p_objnow->addr.ptr_addr.value > ptr_value )
                        { break; }
                else if( p_objnow->addr.ptr_addr.value == ptr_value )   {
-                       if(( p_objnow->addr.qw_size == qw_size )
-                                       && ( OBJINFO_TYPE_FUNCTION == p_objnow->b_type ))       {
-
-                               // Check functionname
-                               strncpy( str_linkname, p_objnow->pstr_name, 255 );
-                               strncat( str_linkname, "@", 255 );
-                               strncat( str_linkname, pstr_vername, 255 );
-
-                               if( !strncmp( str_linkname, pstr_dynsym_name, 256 ) )   {
-                                       p_objret        = p_objnow;
-                                       break;
+                       if( p_objnow->b_status & OBJINFO_STATUS_DYNAMIC )       {
+                               if( dw_hash == p_objnow->dw_hash )      {
+                                       if( !strncmp( pstr_symname, p_objnow->pstr_name, 256 ) )        {
+                                               p_objret        = p_objnow;
+                                               break;
+                                       }
                                }
                        }
                }
@@ -324,12 +319,7 @@ LibGoblin_ObjectInfo *
                                                ? OBJINFO( p_pginfo, p_objnow->addrlink.i_next_id ) : NULL );
        }while( NULL != p_objnow );
 
-       if( NULL != p_objret )  {
-               p_objret->pstr_linkname = pstr_dynsym_name;
-               p_objret->dw_hash_linkname      = Common_CalcDJBhash( pstr_dynsym_name );
-       }
-
-goto_ObjectInfo_SearchDynamicFunction_post:
+goto_ObjectInfo_SearchDynamicSymbol_post:
        return p_objret;
 }
 
@@ -367,7 +357,7 @@ int
                return 0x01;
        }
 
-       if( LIBGOBLIN_OBJINFO_INVALID == p_objinfo->b_status )  {
+       if( OBJINFO_STATUS_INVALID == p_objinfo->b_status )     {
                return 0x02;
        }
 
index 9afdc9e..d6c5f7d 100644 (file)
@@ -72,9 +72,8 @@ LIBGOBLIN_OBJINFO_EXTERN
                        LibGoblin_ProgramInfo *p_pginfo, PtrValue ptr_value, QWord qw_size,
             LibGoblin_ObjectInfo *p_parent, Byte b_mode );
 LIBGOBLIN_OBJINFO_EXTERN
-       LibGoblin_ObjectInfo *ObjectInfo_SearchDynamicFunction(
-                       LibGoblin_ProgramInfo *p_pginfo, PtrValue ptr_value, QWord qw_size,
-                       char *pstr_dynsym_name, char *pstr_vername );
+       LibGoblin_ObjectInfo *ObjectInfo_SearchDynamicSymbol(
+                       LibGoblin_ProgramInfo *p_pginfo, PtrValue ptr_value, char *pstr_symname );
 LIBGOBLIN_OBJINFO_EXTERN
        int ObjectInfo_FreeObjectInfo( LibGoblin_ProgramInfo *p_pginfo, LibGoblin_ObjectInfo *p_binfo );
 LIBGOBLIN_OBJINFO_EXTERN
index bc2cb8a..c9856dc 100644 (file)
@@ -63,8 +63,9 @@ typedef struct        {
 
 
 /*=====================================================================*/
-#define        LIBGOBLIN_OBJINFO_INVALID       0x00
-#define        LIBGOBLIN_OBJINFO_VALID         0x01
+#define        OBJINFO_STATUS_INVALID  0x00
+#define        OBJINFO_STATUS_VALID    0x01    // bit 0
+#define        OBJINFO_STATUS_DYNAMIC  0x02    // bit 1
 
 #define        OBJINFO_TYPE_NULL               0x00
 #define        OBJINFO_TYPE_MASTER             0x01
@@ -117,9 +118,6 @@ typedef     struct  {
        //   [Symbol ] = st_name - String table index of name.
        DWord   dw_hash;
        
-       char    *pstr_linkname;
-       DWord   dw_hash_linkname;
-
        union   {
                Byte            b_data[128];