OSDN Git Service

* Implement: LibGoblin_AddrInfo_Set_Symtab() & surround functions. (Non-Tested, only...
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Tue, 17 Nov 2015 12:35:16 +0000 (21:35 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Tue, 17 Nov 2015 12:35:16 +0000 (21:35 +0900)
libgoblin/drd64_libgoblin_addrinfo.c
libgoblin/drd64_libgoblin_elf.c
libgoblin/drd64_libgoblin_elf.h
libgoblin/drd64_libgoblin_elf64.c
libgoblin/drd64_libgoblin_section.h
libgoblin/drd64_libgoblin_type.h

index 67e8dc3..c1717d5 100644 (file)
@@ -40,12 +40,59 @@ Comment:
 
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
+int
+       LibGoblin_AddrInfo_Set_Symtab(
+                       LibGoblin_BinaryInfo    *p_binfo,
+                       LibGoblin_AddressInfo   *p_addr,
+                       LibGoblin_SymbolWorkInfo        *p_syminfo )
+{
+       
+       Byte            *pb_strtab;
+       Elf32_Sym       *p_sym32;
+       Elf64_Sym       *p_sym64;
+       LibGoblin_SectionInfo   *p_secinfo;
+
+       assert( NULL != p_binfo );
+       assert( NULL != p_addr );
+       assert( NULL != p_syminfo );
+
+       p_secinfo       = LibGoblin_Elf_GetSectionInfo( p_binfo, LIBGOBLIN_ELF_SEC_ID_STRTAB );
+       if( NULL == p_secinfo )         {
+               return -0x01;
+       }
+       pb_strtab       = p_secinfo->pb_data;
+       assert( NULL != pb_strtab );
+
+       if( isElf64( p_binfo ) )        {
+               p_sym64 = (Elf64_Sym *)p_syminfo->pb_symbol;
+
+               p_addr->ptr_address     = p_syminfo->ptr_address;
+               p_addr->pstr_name       = (char *)(pb_strtab + p_sym64->st_name);
+               p_addr->dw_size         = (DWord)p_sym64->st_size;
+               // p_addr->dw_srcid     is update when reading DWARF data.
+               // p_addr->dw_next is update when finalizing ELF/DWARF reading phase.
+               p_addr->b_elf_flags     = p_sym64->st_info;
+               p_addr->w_secid         = LibGoblin_Elf_GetSectionID_fromSectionNumber_inElf(
+                                                               p_binfo, p_secinfo->i_fid, p_sym64->st_shndx );
+       }
+       else if( isElf32( p_binfo ) )   {
+               p_sym32 = (Elf32_Sym *)p_syminfo->pb_symbol;
+
+       }
+       
+       return 0x00;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
 LIBGOBLIN_ADDRINFO_EXTERN
 int
        LibGoblin_AddrInfo_SyncSymbolWorkTable(
                LibGoblin_BinaryInfo            *p_binfo, 
                LibGoblin_SymbolWorkTable       *p_symworktbl )
 {
+       int             i_result;
        DWord   dw_cnt;
        DWord   dw_reallocs;
        LibGoblin_AddressInfo           *p_addr;
@@ -78,7 +125,7 @@ int
        p_syminfo       = p_symworktbl->p_symwork + (p_symworktbl->dw_max_symwork - 1);
        for( dw_cnt = p_symworktbl->dw_max_symwork; dw_cnt > 0; dw_cnt--, p_syminfo--, p_addr-- )       {
                if( LIBGOBLIN_SYMWORKINFO_TYPE_SYMTAB == p_syminfo->dw_type )   {
-
+                       i_result        = LibGoblin_AddrInfo_Set_Symtab( p_binfo, p_addr, p_syminfo );
                }
                else if( LIBGOBLIN_SYMWORKINFO_TYPE_DWARF == p_syminfo->dw_type )       {
 
index 12e8504..6c8949a 100644 (file)
@@ -134,6 +134,47 @@ LibGoblin_SectionInfo *
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
 LIBGOBLIN_ELF_EXTERN
+Word
+       LibGoblin_Elf_GetSectionID_fromSectionNumber_inElf(
+                       LibGoblin_BinaryInfo    *p_binfo,
+                       int             i_analyzefid, 
+                       Word    w_secnumber )
+{
+       Byte    b_secid;
+       Word    w_result        = LIBGOBLIN_ELF_SEC_ID_INVALID;
+       LibGoblin_BinaryFile    *p_bfile;
+       LibGoblin_SectionInfo   *p_secinfo;
+
+       assert( NULL != p_binfo );
+
+       // Through out input value when w_secnumber is not Section Index Value.
+       if( LIBGOBLIN_ELF_SEC_ID_DEFAULT_MAX <= w_secnumber )   {
+               return w_secnumber;
+       }
+
+       p_bfile = &(p_binfo->t_binfile[i_analyzefid]);
+       
+       for( b_secid = 0; b_secid < LIBGOBLIN_ELF_SEC_ID_MAX; b_secid++ )       {
+               p_secinfo       = &(p_bfile->t_section[ b_secid ]);
+
+               if( NULL == p_secinfo->pb_sechdr )              { 
+                       w_result        = LIBGOBLIN_ELF_SEC_ID_INVALID;
+                       break;
+               }
+
+               if( p_secinfo->i_fid == (int)w_secnumber )      {
+                       w_result        = (Word)b_secid;
+                       break;
+               }
+       }
+
+       return w_result;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+LIBGOBLIN_ELF_EXTERN
 int
        LibGoblin_Elf_ReadSymtabSection_toWorkTable(
                        LibGoblin_BinaryInfo    *p_binfo,
index 947b0ca..585b488 100644 (file)
@@ -104,6 +104,9 @@ LIBGOBLIN_ELF_EXTERN
        LibGoblin_SectionInfo *LibGoblin_Elf_GetSectionInfo_fid(
                        LibGoblin_BinaryInfo *p_binfo, Byte b_secid, int i_analyzefid );
 LIBGOBLIN_ELF_EXTERN
+       Word LibGoblin_Elf_GetSectionID_fromSectionNumber_inElf(
+                       LibGoblin_BinaryInfo *p_binfo, int i_analyzefid, Word w_secnumber );
+LIBGOBLIN_ELF_EXTERN
        int LibGoblin_AnalyzeElf(
                        LibGoblin_BinaryInfo *p_binfo, int i_analyzefid );
 
index 94a1de0..01cf435 100644 (file)
@@ -91,7 +91,9 @@ int
                                p_sectbl->pb_data               = (Byte *)(pb_data + p_sechdr->sh_offset);
                                p_sectbl->pstr_secname  = pstr_secname;
                                p_sectbl->qw_size               = p_sechdr->sh_size;
-                               p_sectbl->i_fid                 = i_analyzefid;
+                               // i_fid member set the value of the Section-ID in ELF file 
+                               //   on BinaryFile struct inner SectionTable
+                               p_sectbl->i_fid                 = i_cnt;
                                break;
                        }
                }
@@ -103,7 +105,9 @@ int
                        p_sectbl->pb_data               = (Byte *)(pb_data + p_sechdr->sh_offset);
                        p_sectbl->pstr_secname  = pstr_secname;
                        p_sectbl->qw_size               = p_sechdr->sh_size;
-                       p_sectbl->i_fid                 = i_analyzefid;
+                       // i_fid member set the value of the Section-ID in ELF file 
+                       //   on BinaryFile struct inner SectionTable
+                       p_sectbl->i_fid                 = i_cnt;
                                
                        i_user_section++;
                }
@@ -120,7 +124,7 @@ int
                        p_globsec->pb_data              = p_sectbl->pb_data;
                        p_globsec->pstr_secname = p_sectbl->pstr_secname;
                        p_globsec->qw_size              = p_sectbl->qw_size;
-                       p_globsec->i_fid                = p_sectbl->i_fid;
+                       p_globsec->i_fid                = i_analyzefid;
                }
 
        }
@@ -145,7 +149,7 @@ int
                p_globsec->pb_data              = p_sectbl->pb_data;
                p_globsec->pstr_secname = p_sectbl->pstr_secname;
                p_globsec->qw_size              = p_sectbl->qw_size;
-               p_globsec->i_fid                = p_sectbl->i_fid;
+               p_globsec->i_fid                = i_analyzefid;
        }
        
        return 0x00;
index 97b25b3..9fd3d85 100644 (file)
@@ -39,6 +39,7 @@ Comment:
 
 #define        LIBGOBLIN_ELF_SEC_ID_DEFAULT_MAX        0x22
 #define        LIBGOBLIN_ELF_SEC_ID_MAX                        0x3f
+#define        LIBGOBLIN_ELF_SEC_ID_INVALID            0xff
 
 #define        LIBGOBLIN_ELF_SEC_ID_TEXT                       0x00
 #define        LIBGOBLIN_ELF_SEC_ID_TEXT_INIT          0x01
index b19c9f1..2971975 100644 (file)
@@ -88,13 +88,12 @@ typedef struct      {
 
 /*=====================================================================*/
 typedef        struct  {
-       Word    dw_id;
-       Word    w_flag;
-       Ptr             *p_address;
+       Ptr             ptr_address;
+       char    *pstr_name;
        DWord   dw_size;
        DWord   dw_srcid;
-       DWord   dw_name;
        DWord   dw_next;
+       Byte    b_elf_flags;
        Word    w_secid;
 } LibGoblin_AddressInfo;