OSDN Git Service

* WorkBackup: 2015/11/11(Wed) AM 05:50 (Programming LibGoblin_SymInfo_CreateWorkTable())
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Tue, 10 Nov 2015 20:52:46 +0000 (05:52 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Tue, 10 Nov 2015 20:52:46 +0000 (05:52 +0900)
libgoblin/drd64_libgoblin.h
libgoblin/drd64_libgoblin_checkbin.c
libgoblin/drd64_libgoblin_elf.c
libgoblin/drd64_libgoblin_elf.h
libgoblin/drd64_libgoblin_syminfo.c
libgoblin/drd64_libgoblin_syminfo.h

index db8241c..4e5a923 100644 (file)
@@ -39,6 +39,7 @@ Comment:
 
 #include<stdio.h>
 #include<stdlib.h>
+#include<stddef.h>
 #include<string.h>
 #include<fcntl.h>
 #include<unistd.h>
index 7b06778..2fa8288 100644 (file)
@@ -45,7 +45,6 @@ int
                        int             i_analyzefid )
 {
        Byte    *pb_data;
-       LibGoblin_BinaryFile    *p_bfile;
 
        assert( NULL != p_binfo );
        pb_data = p_binfo->t_binfile[i_analyzefid].pb_binary;
index dfa1f3f..96084fe 100644 (file)
@@ -96,9 +96,27 @@ LIBGOBLIN_ELF_EXTERN
 LibGoblin_SectionInfo *
        LibGoblin_Elf_GetSectionInfo(
                        LibGoblin_BinaryInfo    *p_binfo,
-                       int             i_analyzefid,
                        Byte    b_secid )
 {
+       LibGoblin_SectionInfo   *p_secinfo;
+
+       if( LIBGOBLIN_ELF_SEC_ID_DEFAULT_MAX <= b_secid )       { return NULL; }
+
+       p_secinfo       = &(p_binfo->t_section[b_secid]);
+
+       return p_secinfo;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+LIBGOBLIN_ELF_EXTERN
+LibGoblin_SectionInfo *
+       LibGoblin_Elf_GetSectionInfo_fid(
+                       LibGoblin_BinaryInfo    *p_binfo,
+                       Byte    b_secid,
+                       int             i_analyzefid )
+{
        LibGoblin_BinaryFile    *p_bfile;
        LibGoblin_SectionInfo   *p_secinfo;
 
@@ -107,7 +125,7 @@ LibGoblin_SectionInfo *
 
        if( LIBGOBLIN_ELF_SEC_ID_DEFAULT_MAX <= b_secid )       { return NULL; }
 
-       p_secinfo       = &(p_binfo->t_section[b_secid]);
+       p_secinfo       = &(p_bfile->t_section[b_secid]);
 
        return p_secinfo;
 }
index 8007cbe..947b0ca 100644 (file)
@@ -95,8 +95,14 @@ LIBGOBLIN_ELF_EXTERN
        Byte *LibGoblin_Elf_GetSection(
                        QWord *qw_secsize, LibGoblin_BinaryInfo *p_bin, int i_analyzefid, Byte b_secid );
 LIBGOBLIN_ELF_EXTERN
+       LibGoblin_SectionInfo *LibGoblin_Elf_GetSectionInfo_fid(
+                       LibGoblin_BinaryInfo *p_binfo, Byte b_secid, int i_analyzefid );
+LIBGOBLIN_ELF_EXTERN
        LibGoblin_SectionInfo *LibGoblin_Elf_GetSectionInfo(
-                       LibGoblin_BinaryInfo *p_binfo, int i_analyzefid, Byte b_secid );
+                       LibGoblin_BinaryInfo *p_binfo, Byte b_secid );
+LIBGOBLIN_ELF_EXTERN
+       LibGoblin_SectionInfo *LibGoblin_Elf_GetSectionInfo_fid(
+                       LibGoblin_BinaryInfo *p_binfo, Byte b_secid, int i_analyzefid );
 LIBGOBLIN_ELF_EXTERN
        int LibGoblin_AnalyzeElf(
                        LibGoblin_BinaryInfo *p_binfo, int i_analyzefid );
index 264173f..eda8a79 100644 (file)
@@ -56,17 +56,22 @@ DWord
                        int             i_analyzefid )
 {
        Byte    *pb_symtab;
-       QWord   qw_size;
        DWord   dw_symbols;
+       DWord   dw_sworksz;
+       DWord   dw_cnt;
        Elf32_Shdr      *p_shdr32;
        Elf64_Shdr      *p_shdr64;
+       Elf32_Sym       *p_sym32;
+       Elf64_Sym       *p_sym64;
        LibGoblin_SectionInfo   *p_secinfo;
+       LibGoblin_SymbolWork    *p_symwork;
+       LibGoblin_SymbolWork    *p_swnow;
        
        assert( NULL != p_binfo );
 
        // Check BinaryInfo & Get SymbolEntires
-       // XXX
-       p_secinfo       = LibGoblin_Elf_GetSectionInfo( p_binfo, 0, LIBGOBLIN_ELF_SEC_ID_SYMTAB );
+       p_secinfo       = LibGoblin_Elf_GetSectionInfo_fid(
+                                               p_binfo, LIBGOBLIN_ELF_SEC_ID_SYMTAB, i_analyzefid );
        if( NULL == p_secinfo ) {
                return 0x01;
        }
@@ -79,19 +84,38 @@ DWord
                dw_symbols      = (DWord)p_shdr64->sh_size / (DWord)p_shdr64->sh_entsize;
                pb_symtab       = p_secinfo->pb_data;
        }
-       else if( IsBinfoType_Elf32( p_binfo ) ) {
-
+       else    {
+               p_shdr32        = (Elf32_Shdr *)(p_secinfo->pb_sechdr);
+               if( 0 == p_shdr32->sh_entsize ) {
+                       return -0x02;
+               }
+               dw_symbols      = (DWord)p_shdr32->sh_size / (DWord)p_shdr32->sh_entsize;
+               pb_symtab       = p_secinfo->pb_data;
        }
 
-       // Create WorkTable
+       // Create & Alloc SymbolWorkTable
+       dw_sworksz      = dw_symbols * sizeof( LibGoblin_SymbolWork );
+       p_symwork       = (LibGoblin_SymbolWork *)malloc( dw_sworksz );
+       if( NULL == p_symwork ) {
+               return -0x03;
+       }
+       memset( p_symwork, 0x00, dw_sworksz );
 
-       // Sort WorkTable
+       // Read SymbolSection to SymbolWorkTable
+       p_swnow         = p_symwork;
+       if( IsBinfoType_Elf64( p_binfo ) )      {
+               p_sym64 = (Elf64_Sym *)pb_symtab;
 
-       // Create SymbolTable
+               for( dw_cnt = 0; dw_cnt < dw_symbols; dw_cnt++ )        {
+                       p_swnow->pb_symbol              = (Byte *)p_sym64;
+                       p_swnow->ptr_address    = p_sym64->st_value;
 
-       // Update Symbol Table
+                       p_sym64++;
+                       p_swnow++;
+               }
+       }
 
-       // Create SymbolTable Index
+       // Sort WorkTable
 
        return 0x00;
 }
index 085eb7c..bee78ea 100644 (file)
@@ -48,8 +48,8 @@ Comment:
 
 
 typedef        struct  {
-       Ptr             *p_address;
-       Ptr             *p_symbol;
+       Ptr             ptr_address;
+       Byte    *pb_symbol;
 } LibGoblin_SymbolWork;