OSDN Git Service

*** empty log message ***
authorkoinec <>
Sat, 10 Sep 2011 12:49:41 +0000 (12:49 +0000)
committerkoinec <>
Sat, 10 Sep 2011 12:49:41 +0000 (12:49 +0000)
include/libgoblin.h
libgoblin/drd64_libgoblin.h
libgoblin/drd64_libgoblin_analyze.c
libgoblin/drd64_libgoblin_analyze.h
libgoblin/drd64_libgoblin_binfo.c
libgoblin/drd64_libgoblin_binfo.h
libgoblin/drd64_libgoblin_elf64.c
libgoblin/drd64_libgoblin_elf64.h
libgoblin/elftest.c

index af583bf..20089ff 100644 (file)
@@ -61,10 +61,15 @@ int
 
 LIBGOBLIN_FUNC
 int
-       LibGoblin_AnalyzeBinary(
+       LibGoblin_AnalyzeBinaryMemory(
                Byte    *p_data,
                DWord   dw_size );
 
+LIBGOBLIN_FUNC
+int
+       LibGoblin_AnalyzeBinaryFile(
+               char    *pstr_filepath );
+
 
 
 #endif /* DRD64_HEADER_LIBGOBLIN */
index d5165a5..58b78a2 100644 (file)
@@ -40,8 +40,12 @@ Comment:
 #include<stdio.h>
 #include<stdlib.h>
 #include<string.h>
+#include<fcntl.h>
+#include<unistd.h>
 #include<assert.h>
 #include<elf.h>
+#include<sys/stat.h>
+#include<sys/mman.h>
 #include"../include/drd64_types.h"
 #include"../include/drd64_defines.h"
 #include"../include/drd64_error.h"
index c4be3f2..5aae601 100644 (file)
@@ -38,15 +38,79 @@ Comment:
 #include"drd64_libgoblin.h"
 
 
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
 LIBGOBLIN_FUNC
 int
-       LibGoblin_AnalyzeBinary(
+       LibGoblin_AnalyzeBinaryFile(
+               char    *pstr_filepath )
+{
+       int             i_bid;
+       int             i_bintype;
+       int             i_err;
+       int             i_fd;
+       struct  stat    t_sb;
+       Byte    *p_head;
+       LibGoblin_BinaryInfo    *p_bin;
+
+       /* Alloc BinaryInfo Struct */
+       p_bin   = LibDrd64_BinInfo_AllocBinInfo();
+       if( NULL == p_bin )             {
+               i_bid   = -1;
+               goto goto_LibGoblin_AnalyzeBinaryFile_err;
+       }
+       i_bid   = p_bin->i_id;
+
+       /* Open Test LM */
+       i_fd    = open( pstr_filepath, O_RDONLY );
+       if( -1 == i_fd )        {
+               i_bid   = -2;
+               LibGoblin_FreeBinaryInfo( p_bin );
+               goto goto_LibGoblin_AnalyzeBinaryFile_err;
+       }
+       p_bin->i_fd     = i_fd;
+       strncpy( p_bin->str_filepath, pstr_filepath, DRD64_MAX_PATH );
+
+       /* Get FileSize */
+       i_err   = fstat( i_fd, &t_sb );
+       if( -1 == i_err )               {
+               i_bid   = -2;
+               close( i_fd );
+               LibGoblin_FreeBinaryInfo( p_bin );
+               goto goto_LibGoblin_AnalyzeBinaryFile_err;
+       }
+
+       p_head  = mmap( NULL, t_sb.st_size, PROT_READ, MAP_SHARED, i_fd, 0 );
+       if( MAP_FAILED == p_head )              {
+               i_bid   = -3;
+               close( i_fd );
+               LibGoblin_FreeBinaryInfo( p_bin );
+               goto goto_LibGoblin_AnalyzeBinaryFile_err;
+       }
+
+       p_bin->p_binary = p_head;
+       p_bin->dw_size  = (DWord)t_sb.st_size;
+
+       LibGoblin_AnalyzeBinary( p_bin );
+        
+
+goto_LibGoblin_AnalyzeBinaryFile_err:
+
+       return i_bid;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+LIBGOBLIN_FUNC
+int
+       LibGoblin_AnalyzeBinaryMemory(
                Byte    *p_data,
                DWord   dw_size )
 {
        int             i_bid;
        int             i_bintype;
-       int             i_err;
+       int             i_result;
        LibGoblin_BinaryInfo    *p_bin;
 
        /* Alloc BinaryInfo Struct */
@@ -57,20 +121,37 @@ int
        p_bin->p_binary = p_data;
        p_bin->dw_size  = dw_size;
 
+       i_result = LibGoblin_AnalyzeBinary( p_bin );
+
+       return i_bid;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+LIBGOBLIN_ANALYZE_EXTERN
+int
+       LibGoblin_AnalyzeBinary(
+               LibGoblin_BinaryInfo    *p_bin )
+{
+       int             i_result;
+       int             i_bintype;
+
        /* Check Binary Format */
        i_bintype       = LibGoblin_CheckBinary( p_bin );
 
        if( LIBGOBLIN_BINFO_TYPE_ELF == i_bintype )     {
                /* Analyze ELF-Binary Format */
-               LibGoblin_AnalyzeElf( p_bin );
+               i_result = LibGoblin_AnalyzeElf( p_bin );
                /* Analyze DWARF-Debug Format */
        }       else {
        
        }
        
 
-       return i_bid;
+       return i_result;
 }
 
 
+
 /* EOF of drd64_.c ----------------------------------- */
index f2c7a86..9519032 100644 (file)
@@ -45,6 +45,11 @@ Comment:
        #define LIBGOBLIN_ANALYZE_EXTERN        extern
 #endif
 
+LIBGOBLIN_ANALYZE_EXTERN
+int
+       LibGoblin_AnalyzeBinary(
+               LibGoblin_BinaryInfo    *p_bin );
+
 
 
 #endif /* DRD64_HEADER_LIBGOBLIN_BINFO */
index c2ccca0..8750de4 100644 (file)
@@ -83,6 +83,7 @@ LibGoblin_BinaryInfo *
        memset( p_binfo_now, 0x00, sizeof( LibGoblin_BinaryInfo ) );
 
        p_binfo_now->i_id       = i_id_now;
+       p_binfo_now->i_fd       = -1;
 
        return p_binfo_now;
 }
@@ -103,6 +104,11 @@ int
                p_binfo->p_format       = NULL;
        }
 
+       if( -1 != p_binfo->i_fd )       {
+               munmap( p_binfo->p_binary, p_binfo->dw_size );
+               p_binfo->i_fd   = 0;
+       }
+
        memset( p_binfo, 0x00, sizeof( LibGoblin_BinaryInfo ) );
 
        p_binfo->i_id   = -1;
@@ -137,6 +143,16 @@ int
        LibGoblin_TermBinaryInfo(
                void )
 {
+       LibGoblin_BinaryInfo    *p_bin;
+
+       if( gi_now_binary_info > 0 )    {
+               for( ; gi_now_binary_info >= 0; gi_now_binary_info-- )  {
+                       p_bin = LibGoblin_BInfo_GetBinaryInfo( gi_now_binary_info );
+                       LibGoblin_FreeBinaryInfo( p_bin );
+               }
+       }
+
+       
        free( gp_binary_info );
        
        gp_binary_info          = NULL;
index 96405ca..9d1dc5d 100644 (file)
@@ -56,9 +56,17 @@ Comment:
 #define        LIBGOBLIN_BINFO_ENDIAN_LITTLE   0x01
 #define        LIBGOBLIN_BINFO_ENDIAN_BIG              0x02
 
+#define        LIBGOBLIN_BINFO_SECTION_TEXT    0x00
+#define        LIBGOBLIN_BINFO_SECTION_DATA    0x01
+#define        LIBGOBLIN_BINFO_SECTION_BSS             0x02
+
+
 typedef struct {
        int                     i_id;
 
+       int                     i_fd;
+       char            str_filepath[DRD64_MAX_PATH];
+
        DWord           dw_size;
        Byte            *p_binary;
 
@@ -67,7 +75,7 @@ typedef struct        {
 
        void            *p_format;
        
-} LibGoblin_BinaryInfo;
+}      LibGoblin_BinaryInfo;
 
 
 
index c353021..c306423 100644 (file)
@@ -68,6 +68,7 @@ int
        int             i_err;
        Byte    *p_data;
        LibGoblin_BinaryInfo_Elf64      *p_elf;
+       Elf64_Ehdr      *p_elfhdr;
 
        assert( NULL != p_bin );
 
@@ -77,8 +78,12 @@ int
        assert( NULL != p_bin->p_format );
        p_elf   = (LibGoblin_BinaryInfo_Elf64 *)p_bin->p_format;
 
-
-       p_elf->p_elfhdr = (Elf64_Ehdr *)p_data;
+       /* Set ELF64 Header */
+       p_elfhdr        = (Elf64_Ehdr *)p_data;
+       memcpy( &(p_elf->elf_elfhdr), p_elfhdr, p_elfhdr->e_ehsize );
+       
+       /* Read & Analyze Section Header */
+       
 
        puts("OK");
 
index 645b2c5..eba6a96 100644 (file)
@@ -45,10 +45,15 @@ Comment:
        #define LIBGOBLIN_ELF64_EXTERN  extern
 #endif
 
+
+
 typedef struct {
-       Elf64_Ehdr              *p_elfhdr;
+       Elf64_Ehdr              elf_elfhdr;
+       //Elf64_Ehdr            *p_elfhdr;
        Elf64_Shdr              *p_sechdr;
 
+       Byte    *p_seciton[10];
+
 } LibGoblin_BinaryInfo_Elf64;
 
 
index 6728c3d..315b025 100644 (file)
@@ -22,7 +22,7 @@ int
        unsigned char   *p_head;
 
        /* Open Test LM */
-       i_fd    = open( "test", O_RDONLY );
+       /*i_fd  = open( "test", O_RDONLY );
        if( -1 == i_fd )        { return 0x01; }
 
        i_err   = fstat( i_fd, &t_sb );
@@ -30,14 +30,13 @@ int
 
        p_head  = mmap( NULL, t_sb.st_size, PROT_READ, MAP_SHARED, i_fd, 0 );
        if( MAP_FAILED == p_head )      { goto goto_main_err; }
-
+*/
        LibGoblin_Init();
 
-       LibGoblin_AnalyzeBinary( p_head, t_sb.st_size );
+       LibGoblin_AnalyzeBinaryFile( "test" );
        
        LibGoblin_Term();
 
-       i_err   = munmap( p_head, t_sb.st_size );
 
 goto_main_err:
        close( i_fd );