else
{ ptr_origin += pelf_rela->r_addend; }
+/*
printf(" debug: r_offset = %lxh, r_addend = %lxh, type = %xh, symbol = %xh origin = %lxh\n",
pelf_rela->r_offset, pelf_rela->r_addend, dw_type, dw_symbol, ptr_origin );
-
+*/
pobj_rel = ObjectInfo_SearchAddressSize(
p_pginfo, (PtrValue)pelf_rela->r_offset, sizeof( void * ) );
if( (PtrValue)pelf_rela->r_offset != ptr_origin ) {
pobj_origin = ObjectInfo_SearchAddressSize(
- p_pginfo, (PtrValue)ptr_origin, 0x00000000 );
+ p_pginfo, (PtrValue)ptr_origin, sizeof( void * ) );
+ }
+ else
+ { pobj_origin = pobj_rel; }
- if( NULL != pobj_origin ) {
- pobj_origin->dynamic.i_objid_rel = pobj_rel->i_id;
- pobj_rel->rel.i_objid_origin = pobj_origin->i_id;
- }
+ if( NULL != pobj_origin ) {
+ pobj_origin->dynamic.i_objid_rel = pobj_rel->i_id;
+ pobj_rel->rel.i_objid_origin = pobj_origin->i_id;
}
}
LibGoblin_BinaryInfo *p_binfo )
{
int i_ret;
+ Byte b_cnt;
+ Elf64_Shdr *p_sechdr;
+ LibGoblin_SectionInfo *psec_now;
+ LibGoblin_BinaryFile *p_bfile;
+
+ assert( NULL != p_binfo );
+ p_bfile = BinaryFile_GetBinaryFile( p_binfo->i_binfile );
+ assert( NULL != p_bfile );
// XXX: Search Rel/Rela Section ---
i_ret = ELF64_Rela_ReadIndicateSection_Rela( p_binfo, LIBGOBLIN_SECTION_ID_RELA_PLT );
+ i_ret = ELF64_Rela_ReadIndicateSection_Rela( p_binfo, LIBGOBLIN_SECTION_ID_RELA_DYN );
+
+ for( b_cnt = LIBGOBLIN_SECTION_ID_DEFAULT_MAX;
+ b_cnt < LIBGOBLIN_SECTION_ID_MAX; b_cnt++ ) {
+
+ psec_now = &(p_bfile->t_section[ b_cnt ]);
+ p_sechdr = (Elf64_Shdr *)psec_now->pb_sechdr;
+ if( NULL == p_sechdr ) { break; }
+
+ if( SHT_RELA == p_sechdr->sh_type ) {
+ i_ret = ELF64_Rela_ReadIndicateSection_Rela( p_binfo, b_cnt );
+ }
+ }
+
return i_ret;
}