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 ) {
p_obj->dynamic.i_dynsym_index = i_symindex;
p_obj->dw_status |= OBJINFO_STATUS_RESOLV1;
}
+*/
}
// --------------
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 );
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;
}
}