OSDN Git Service

2019/03/07(Thr) 05:19
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Wed, 6 Mar 2019 20:19:04 +0000 (05:19 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Wed, 6 Mar 2019 20:19:04 +0000 (05:19 +0900)
 (LibGoblin)
  * WorkBackup

libgoblin/drd64_libgoblin_elf_dynsym.c
libgoblin/drd64_libgoblin_elf_hash.c
libgoblin/drd64_libgoblin_elf_hash.h

index 67e737a..64471ae 100644 (file)
@@ -151,6 +151,7 @@ int
                        LibGoblin_BinaryInfo    *p_binfo )
 {
        char    *pstr_symname;
+       char    *pstr_vername;
        Byte    *pb_dynstr;
        int             i_bid;
        int             i_result;
@@ -158,7 +159,8 @@ int
        DWord   dw_sym;
        DWord   dw_vermax;
        DWord   dw_symbols;
-       Word    *pw_gnuver;
+       Word    w_gnuver        = 0;
+       Word    *pw_gnuver      = NULL;
        Elf64_Shdr      *p_shdr;
        Elf64_Sym       *p_sym;
        DynSym_Version  *p_version;
@@ -204,9 +206,13 @@ int
        p_pginfo        = ProgInfo_GetProgInfo( p_binfo->i_pginfo );
        assert( NULL != p_pginfo );
 
+
        // Loop. ---
+       pstr_vername    = NULL;
        p_sym   = (Elf64_Sym *)psec_dynsym->pb_data;
-       for( dw_sym = 0; dw_sym < dw_symbols; dw_sym++, p_sym++, pw_gnuver++ )  {
+       //for( dw_sym = 0; dw_sym < dw_symbols; dw_sym++, p_sym++, pw_gnuver++ )        {
+       for( dw_sym = 0; dw_sym < dw_symbols; dw_sym++, p_sym++ )       {
+               if( NULL != pw_gnuver ) { w_gnuver      = *pw_gnuver++; }
                
                // NODATA symbol.
                if(( 0x00000000 == p_sym->st_value )
@@ -225,11 +231,12 @@ int
 
                // Search DynSym_Version ---
                i_bid           = p_binfo->i_id;
-               if( 1 < *pw_gnuver )    {
+               if( 1 < w_gnuver )      {
                        p_vernow        = p_version;
                        for( dw_cnt = 0; dw_cnt < dw_vermax; dw_cnt++, p_vernow++ )     {
-                               if( *pw_gnuver == p_vernow->dw_other )  {
+                               if( w_gnuver == p_vernow->dw_other )    {
                                        i_bid   = p_vernow->i_binfo_id;
+                                       pstr_vername    = p_vernow->pstr_vername;
                                        break;
                                }
                        }
@@ -245,15 +252,14 @@ int
                        p_binlib        = BinaryInfo_GetBinInfo( i_bid );
                        assert( NULL != p_binlib );
 
-                       i_result        = ELF64_GnuHash_SearchDynSym( p_binlib, pstr_symname );
+                       i_result        = ELF64_GnuHash_SearchDynSym( p_binlib, pstr_symname, pstr_vername );
                        if( 0 <= i_result )             {
                                break;
                        }
 
                        i_bid   = BinInfo_SearchNextSlave( p_binfo->i_id, i_bid );
                }
-                               printf(" debug: [%2ld] %s (%s)\n", dw_sym, pstr_symname, p_binlib->str_filename );
-                               printf(" %d\n", i_result );
+       printf(" debug: [%2ld] %s (%s) = %d\n", dw_sym, pstr_symname, p_binlib->str_filename, i_result );
                
 
                // 2019/03/05 -- TODO
index 69a5875..a37b092 100644 (file)
@@ -54,7 +54,8 @@ LIBGOBLIN_ELF_HASH_EXTERN
 int
        ELF64_GnuHash_SearchDynSym(
                        LibGoblin_BinaryInfo    *p_binfo,
-                       char *pstr_symname )
+                       char    *pstr_symname,
+                       char    *pstr_vername )
 {
        int             i_ret   = -0x0f;
        char    *pstr_dynname;
index 9d112e2..978e097 100644 (file)
@@ -50,7 +50,7 @@ Comment:
 #endif
 
 LIBGOBLIN_ELF_HASH_EXTERN
-       int ELF64_GnuHash_SearchDynSym( LibGoblin_BinaryInfo *p_binfo, char *pstr_symname );
+       int ELF64_GnuHash_SearchDynSym( LibGoblin_BinaryInfo *p_binfo, char *pstr_symname, char *pstr_vername );