OSDN Git Service

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

libgoblin/drd64_libgoblin_elf_dynsym.c
libgoblin/drd64_libgoblin_elf_rela.c

index d06ae9f..bf2a514 100644 (file)
@@ -164,13 +164,28 @@ int
                if( 0 > i_symindex )    { continue; }
 
                // If dynsym addr = 0x00000000, Search PLT addr. from .got addr. ---
-//XXX
-               ptr_addr        = ELF64_Rela_GetPLTaddr_fromGOT( p_binfo, pstr_symname );
                if( 0x00000000 == p_sym->st_value )
                        { ptr_addr      = ELF64_Rela_GetPLTaddr_fromGOT( p_binfo, pstr_symname ); }
                else
-                       { ptr_addr      = (PtrValue)p_sym->st_value + p_binfo->ptr_loadbase; }
+                       { ptr_addr      = (PtrValue)p_sym->st_value; }
+
+               if( 0x00000000 < ptr_addr )     {
+                       ptr_addr        += p_binfo->ptr_loadbase;
+                       p_obj   = ObjectInfo_SearchDynamicSymbol( p_pginfo, ptr_addr, pstr_symname );
+                       // 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(
+                                                                       p_pginfo, p_binfo, ptr_addr, p_sym, pb_dynstr );
+                       }
+
+                       if( NULL != p_obj )     {
+                               p_obj->dynamic.i_binfo_origin   = i_bid;
+                               p_obj->dynamic.i_dynsym_index   = i_symindex;
+                               p_obj->dw_status                                |= OBJINFO_STATUS_RESOLV1;
+                       }
+               }
 
+/*
                p_obj   = ObjectInfo_SearchDynamicSymbol( p_pginfo, ptr_addr, pstr_symname );
                // If the target program is stripped, p_obj = NULL because don't exist .symtab section.
                if( NULL == p_obj )     {
@@ -183,6 +198,7 @@ int
                        p_obj->dynamic.i_dynsym_index   = i_symindex;
                        p_obj->dw_status                                |= OBJINFO_STATUS_RESOLV1;
                }
+*/
        }
 
 
index a4c20e3..32e3968 100644 (file)
@@ -104,13 +104,10 @@ PtrValue
        // --------------
        psec_plt = Section_GetSectionInfo_fromBinaryFile( p_bfile, LIBGOBLIN_SECTION_ID_PLT );
        if( NULL == psec_plt )  { return 0x00; }
-printf("  debug: %s\n", pstr_symname );
 
        if( 0 == psec_plt->qw_entsize )
                { return 0x00; }
 
-printf("   debug plt entsize = %lx %lx %lx %d\n", qw_entsize, psec_plt->qw_entsize, psec_plt->qw_size, dw_maxrels );
-
        for( dw_cnt = 0; dw_cnt < dw_maxrels; dw_cnt++, pelf_rela++ )   {
        // r_info - Relocation type and symbol index.
                dw_symbol       = ELF64_R_SYM( pelf_rela->r_info );
@@ -127,7 +124,6 @@ printf("   debug plt entsize = %lx %lx %lx %d\n", qw_entsize, psec_plt->qw_entsi
                        qw_temp         = (QWord)pelf_rela->r_offset - (QWord)psec_gotplt->ptr_addr.value;
                        pptr_pltaddr    = (PtrValue *)(psec_gotplt->pb_data + qw_temp);
                        ptr_ret         = (PtrValue)(*pptr_pltaddr - (*pptr_pltaddr % psec_plt->qw_entsize));
-printf("   debug plt addr = %lx %lx\n", *pptr_pltaddr, ptr_ret );
                        break;
                }
        }