OSDN Git Service

2019/03/21(Thr) 11:40
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Thu, 21 Mar 2019 02:40:34 +0000 (11:40 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Thu, 21 Mar 2019 02:40:34 +0000 (11:40 +0900)
 (LibGoblin)
  * WorkBackup

libgoblin/drd64_libgoblin_elf_rela.c

index 9e0678b..8386513 100644 (file)
@@ -102,9 +102,10 @@ int
                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 * ) );
@@ -121,12 +122,14 @@ int
 
                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;
                }
 
        }
@@ -143,11 +146,33 @@ int
                        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;
 }