LIBGOBLIN_ANALYZE_EXTERN
int
LibGoblin_AnalyzeBinary(
- LibGoblin_BinaryInfo *p_bin )
+ LibGoblin_BinaryInfo *p_binfo,
+ int i_analyzefid )
{
int i_result;
- int i_bintype;
+ LibGoblin_BinaryFile *p_bfile;
- /* Check Binary Format */
- i_bintype = LibGoblin_CheckBinary( p_bin );
+ assert( NULL != p_binfo );
- if( LIBGOBLIN_BINFO_TYPE_ELF == i_bintype ) {
- /* Analyze ELF-Binary Format */
- i_result = LibGoblin_AnalyzeElf( p_bin );
- /* Analyze DWARF-Debug Format */
- } else {
+ p_bfile = &(p_binfo->t_binfile[ i_analyzefid ]);
+ /* XXX: check binaryfile is ELF file */
+ if( 0x00 == (DRD64_LIBFILETYPE_SUB_ELF & p_bfile->dw_flag) ) {
+ return 0x01;
}
-
+
+ /* Analyze ELF & Debug-Info. ---*/
+ i_result = LibGoblin_AnalyzeElf( p_binfo, i_analyzefid );
return i_result;
}
#endif
LIBGOBLIN_ANALYZE_EXTERN
-int
- LibGoblin_AnalyzeBinary(
- LibGoblin_BinaryInfo *p_bin );
+ int LibGoblin_AnalyzeBinary(
+ LibGoblin_BinaryInfo *p_bin, int i_analyzefid );
LibGoblin_BinInfo_ClearBinInfo(
LibGoblin_BinaryInfo *p_binfo )
{
+ int i_cnt;
+
assert( NULL != p_binfo );
memset( p_binfo, 0x00, sizeof( LibGoblin_BinaryInfo ) );
p_binfo->i_id = -0x01;
- p_binfo->i_fd = -0x01;
+ for( i_cnt = 0; i_cnt < LIBGOBLIN_BINFO_MAXFILES; i_cnt++ ) {
+ p_binfo->t_binfile[i_cnt].i_fd = -0x01;
+ }
return;
}
LibGoblin_BinaryInfo *p_binfo )
{
int i_binfoid;
+ int i_cnt;
if( NULL == p_binfo ) { return 0x01; }
- if( NULL != p_binfo->p_format ) {
- free( p_binfo->p_format );
- p_binfo->p_format = NULL;
+ for( i_cnt = 0; i_cnt < LIBGOBLIN_BINFO_MAXFILES; i_cnt++ ) {
+ if( NULL == p_binfo->t_binfile[i_cnt].p_elf ) {
+ free( p_binfo->t_binfile[i_cnt].p_elf );
+ p_binfo->t_binfile[i_cnt].p_elf = NULL;
+ }
}
i_binfoid = p_binfo->i_id;
LibGoblin_CheckBinary(
LibGoblin_BinaryInfo *p_bin )
{
- int i_result;
- Byte *p_data;
- assert( NULL != p_bin );
-
- p_data = p_bin->pb_binary;
- assert( NULL != p_data );
-
- /* Judge Elf-Header? */
- if( 0x00 != LibGoblin_IsElf( p_data ) ) {
- p_bin->b_type = LIBGOBLIN_BINFO_TYPE_ELF;
- i_result = LIBGOBLIN_BINFO_TYPE_ELF;
- }
- else {
- p_bin->b_type = LIBGOBLIN_BINFO_TYPE_NONE;
- i_result = LIBGOBLIN_BINFO_TYPE_NONE;
- }
-
- return i_result;
+ return 0x00;
}
/* Get .debug_abbrev section Info */
pb_data_abbrev = LibGoblin_Elf_GetSection(
- &qw_size_abbrev, p_bin,
+ &qw_size_abbrev, p_bin, 0,
LIBGOBLIN_ELF_SEC_ID_DEBUG_ABBREV );
if( NULL == pb_data_abbrev ) { return 0x00; }
/* Get .debug_abbrev section Info */
pb_data = LibGoblin_Elf_GetSection(
- &qw_size_abbrev, p_bin,
+ &qw_size_abbrev, p_bin, 0,
LIBGOBLIN_ELF_SEC_ID_DEBUG_ABBREV );
if( NULL == pb_data ) { return 0x01; }
/* Get .debug_abbrev section Info */
pb_data = LibGoblin_Elf_GetSection(
- &qw_size_abbrev, p_bin,
+ &qw_size_abbrev, p_bin, 0,
LIBGOBLIN_ELF_SEC_ID_DEBUG_ABBREV );
if( NULL == pb_data ) { return 0x01; }
/* Get .debug_abbrev section Info */
pb_data = LibGoblin_Elf_GetSection(
- &qw_size_info, p_bin,
+ &qw_size_info, p_bin, 0,
LIBGOBLIN_ELF_SEC_ID_DEBUG_INFO );
if( NULL == pb_data ) { return 0x01; }
/* Get .debug_abbrev section Info */
pb_data = LibGoblin_Elf_GetSection(
- &qw_size, p_bin,
+ &qw_size, p_bin, 0,
LIBGOBLIN_ELF_SEC_ID_DEBUG_LINE );
if( NULL == pb_data ) { return 0x01; }
Byte *
LibGoblin_Elf_GetSection(
QWord *qw_secsize,
- LibGoblin_BinaryInfo *p_bin,
+ LibGoblin_BinaryInfo *p_binfo,
+ int i_analyzefid,
Byte b_secid )
{
Byte *pb_data;
+ Byte *pb_binary;
LibGoblin_Format_Elf64 *p_elf64;
LibGoblin_Format_Elf32 *p_elf32;
Elf64_Shdr *p_elfshr64;
Elf32_Shdr *p_elfshr32;
+ LibGoblin_BinaryFile *p_bfile;
- assert( NULL != p_bin );
+ assert( NULL != p_binfo );
+ p_bfile = &(p_binfo->t_binfile[ i_analyzefid ]);
+ pb_binary = p_bfile->pb_binary;
pb_data = NULL;
*qw_secsize = 0;
+
if( LIBGOBLIN_ELF_SEC_ID_DEFAULT_MAX <= b_secid ) { return NULL; }
- if( IsBinfoType_Elf64(p_bin) ) {
- p_elf64 = (LibGoblin_Format_Elf64 *)p_bin->p_format;
+ if( IsBinfoType_Elf64(p_binfo) ) {
+ p_elf64 = (LibGoblin_Format_Elf64 *)p_binfo->p_format;
p_elfshr64 = p_elf64->p_section[b_secid];
- pb_data = (Byte *)(p_bin->pb_binary + p_elfshr64->sh_offset);
+ pb_data = (Byte *)(pb_binary + p_elfshr64->sh_offset);
*qw_secsize = (QWord)p_elfshr64->sh_size;
}
- else if( IsBinfoType_Elf32(p_bin) ) {
- p_elf32 = (LibGoblin_Format_Elf32 *)p_bin->p_format;
+ else if( IsBinfoType_Elf32(p_binfo) ) {
+ p_elf32 = (LibGoblin_Format_Elf32 *)p_binfo->p_format;
p_elfshr32 = p_elf32->p_section[b_secid];
- pb_data = (Byte *)(p_bin->pb_binary + p_elfshr32->sh_offset);
+ pb_data = (Byte *)(pb_binary + p_elfshr32->sh_offset);
*qw_secsize = (QWord)p_elfshr32->sh_size;
}
LIBGOBLIN_ELF_EXTERN
int
LibGoblin_AnalyzeElf(
- LibGoblin_BinaryInfo *p_bin )
+ LibGoblin_BinaryInfo *p_binfo,
+ int i_analyzefid )
{
- //int i_err;
Byte *pb_data;
+ LibGoblin_BinaryFile *p_bfile;
- assert( NULL != p_bin );
- pb_data = p_bin->pb_binary;
+ assert( NULL != p_binfo );
+ p_bfile = &(p_binfo->t_binfile[ i_analyzefid ]);
+ pb_data = p_bfile->pb_binary;
assert( NULL != pb_data );
/* Analyze ELF Ident Header from Bits ---*/
if( ELFCLASS64 == *(pb_data + EI_CLASS) )
- { p_bin->b_type = LIBGOBLIN_BINFO_TYPE_ELF64; }
+ { p_binfo->b_type = LIBGOBLIN_BINFO_TYPE_ELF64; }
else if( ELFCLASS32 == *(pb_data + EI_CLASS) )
- { p_bin->b_type = LIBGOBLIN_BINFO_TYPE_ELF32; }
+ { p_binfo->b_type = LIBGOBLIN_BINFO_TYPE_ELF32; }
/* Analyze ELF Ident Header from Endian ---*/
if( ELFDATA2LSB == *(pb_data + EI_DATA) )
- { p_bin->b_endian = LIBGOBLIN_BINFO_ENDIAN_LITTLE; }
+ { p_binfo->b_endian = LIBGOBLIN_BINFO_ENDIAN_LITTLE; }
else if( ELFDATA2MSB == *(pb_data + EI_DATA) )
- { p_bin->b_endian = LIBGOBLIN_BINFO_ENDIAN_BIG; }
+ { p_binfo->b_endian = LIBGOBLIN_BINFO_ENDIAN_BIG; }
/* Alloc BinaryInfo Format Struct Area from bits ---*/
- if( LIBGOBLIN_BINFO_TYPE_ELF64 == p_bin->b_type ) {
- p_bin->p_format = LibGoblin_Elf64_AllocFormat();
+ if( LIBGOBLIN_BINFO_TYPE_ELF64 == p_binfo->b_type ) {
+ p_binfo->p_format = LibGoblin_Elf64_AllocFormat();
}
- else if( LIBGOBLIN_BINFO_TYPE_ELF32 == p_bin->b_type ) {
- p_bin->p_format = LibGoblin_Elf32_AllocFormat();
+ else if( LIBGOBLIN_BINFO_TYPE_ELF32 == p_binfo->b_type ) {
+ p_binfo->p_format = LibGoblin_Elf32_AllocFormat();
}
- if( NULL == p_bin->p_format ) {
+ if( NULL == p_binfo->p_format ) {
return 0x01;
}
/* Analyze ELF Header */
- if( LIBGOBLIN_BINFO_TYPE_ELF64 == p_bin->b_type ) {
- LibGoblin_Elf64_Analyze( p_bin );
+ if( LIBGOBLIN_BINFO_TYPE_ELF64 == p_binfo->b_type ) {
+ LibGoblin_Elf64_Analyze( p_binfo, i_analyzefid );
}
- else if( LIBGOBLIN_BINFO_TYPE_ELF32 == p_bin->b_type ) {
+ else if( LIBGOBLIN_BINFO_TYPE_ELF32 == p_binfo->b_type ) {
}
/* Analyze Dwarf-Debug Info. */
- if( 0x00 != LibGoblin_IsDwarf( p_bin ) ) {
- LibGoblin_AnalyzeDwarf( p_bin );
+ if( 0x00 != LibGoblin_IsDwarf( p_binfo ) ) {
+ LibGoblin_AnalyzeDwarf( p_binfo );
}
LIBGOBLIN_ELF_EXTERN
- int
- LibGoblin_IsElf(
- Byte *p_data );
-
+ int LibGoblin_IsElf( Byte *p_data );
+LIBGOBLIN_ELF_EXTERN
+ Byte *LibGoblin_Elf_GetSection(
+ QWord *qw_secsize, LibGoblin_BinaryInfo *p_bin, int i_analyzefid, Byte b_secid );
LIBGOBLIN_ELF_EXTERN
- Byte *
- LibGoblin_Elf_GetSection(
- QWord *qw_secsize,
- LibGoblin_BinaryInfo *p_bin,
- Byte b_secid );
+ int LibGoblin_AnalyzeElf(
+ LibGoblin_BinaryInfo *p_binfo, int i_analyzefid );
#endif /* DRD64_HEADER_LIBGOBLIN_BINFO */
LIBGOBLIN_ELF64_EXTERN
int
LibGoblin_Elf64_Analyze(
- LibGoblin_BinaryInfo *p_bin )
+ LibGoblin_BinaryInfo *p_binfo,
+ int i_analyzefid )
{
//int i_err;
Byte *pb_data;
LibGoblin_Format_Elf64 *p_elf;
- //Elf64_Ehdr *p_elfhdr;
- assert( NULL != p_bin );
+ assert( NULL != p_binfo );
- assert( NULL != p_bin->pb_binary );
- pb_data = p_bin->pb_binary;
+ pb_data = p_binfo->t_binfile[i_analyzefid].pb_binary;
+ assert( NULL != pb_data );
- assert( NULL != p_bin->p_format );
- p_elf = (LibGoblin_Format_Elf64 *)p_bin->p_format;
+ assert( NULL != p_binfo->p_format );
+ p_elf = (LibGoblin_Format_Elf64 *)p_binfo->p_format;
/* Set ELF64 Header */
p_elf->p_elfhdr = (Elf64_Ehdr *)pb_data;
/* Read & Analyze Section Header */
LibGoblin_Elf64_SetSectionHeader( p_elf, pb_data );
- test( p_bin );
+ //test( p_binfo );
return 0x00;
}
-
+/*
int test( LibGoblin_BinaryInfo *p_bin )
{
return 0x00;
}
+*/
/* EOF of drd64_.c ----------------------------------- */
LIBGOBLIN_ELF64_EXTERN
-void *
- LibGoblin_Elf64_AllocFormat(
- void );
-
+ void *LibGoblin_Elf64_AllocFormat( void );
LIBGOBLIN_ELF64_EXTERN
-int
- LibGoblin_Elf64_Analyze(
- LibGoblin_BinaryInfo *p_bin );
+ int LibGoblin_Elf64_Analyze( LibGoblin_BinaryInfo *p_bin, int i_analyzefid );
int
LibGoblin_ReadBinary_File(
LibGoblin_BinaryInfo *p_binfo,
- const char *pstr_filepath )
+ const char *pstr_filepath,
+ int i_filetype )
{
int i_result = 0x00;
int i_err;
int i_fd = -0x01;
- struct stat t_sb;
Byte *pb_head;
+ LibFileType_FileType t_ftype;
+ LibGoblin_BinaryFile *p_bfile;
assert( NULL != p_binfo );
goto goto_LibGoblin_ReadBinary_File_post;
}
- /* Get FileSize */
- i_err = fstat( i_fd, &t_sb );
- if( -1 == i_err ) {
+ /* Get FileSize & FileType by LibFileType */
+ i_err = LibFileType_CheckFileType( &t_ftype, pstr_filepath, i_fd );
+ if( 0x00 != i_err ) {
close( i_fd );
goto goto_LibGoblin_ReadBinary_File_post;
}
+ /* XXX : check i_filetype value */
+
+ p_bfile = &(p_binfo->t_binfile[ i_filetype ]);
+
/* Memory Mapping from Binary-file */
- pb_head = mmap( NULL, t_sb.st_size, PROT_READ, MAP_SHARED, i_fd, 0 );
+ pb_head = mmap( NULL, t_ftype.dw_filesize, PROT_READ, MAP_SHARED, i_fd, 0 );
if( MAP_FAILED == pb_head ) {
close( i_fd );
goto goto_LibGoblin_ReadBinary_File_post;
}
- p_binfo->pb_binary = pb_head;
- p_binfo->dw_size = (DWord)t_sb.st_size;
- p_binfo->i_fd = i_fd;
+ memcpy( (void *)&(p_bfile->t_ftype), (void *)&t_ftype, sizeof( LibFileType_FileType ));
+ p_bfile->pb_binary = pb_head;
+ p_bfile->dw_size = t_ftype.dw_filesize;
+ p_bfile->i_fd = i_fd;
+ p_bfile->dw_flag = LIBGOBLIN_BINFO_FILE_MMAP;
p_binfo->b_phase = LIBGOBLIN_BINFO_PHASE_BINREAD;
- strncpy( p_binfo->str_filepath, pstr_filepath, DRD64_MAX_PATH );
+ strncpy( p_bfile->str_filepath, pstr_filepath, DRD64_MAX_PATH );
//LibGoblin_AnalyzeBinary( p_binfo );
LibGoblin_ReadBinary_Memory(
LibGoblin_BinaryInfo *p_binfo,
Byte *pb_data,
- DWord dw_size )
+ DWord dw_size,
+ int i_filetype )
{
+ LibGoblin_BinaryFile *p_bfile;
assert( NULL != p_binfo );
return -0x01;
}
- p_binfo->pb_binary = pb_data;
- p_binfo->dw_size = dw_size;
+ p_bfile = &(p_binfo->t_binfile[ i_filetype ]);
+
+ p_bfile->pb_binary = pb_data;
+ p_bfile->dw_size = dw_size;
+ p_bfile->dw_flag = LIBGOBLIN_BINFO_FILE_EXTALLOC;
p_binfo->b_phase = LIBGOBLIN_BINFO_PHASE_BINREAD;
//i_result = LibGoblin_AnalyzeBinary( p_bin );
LibGoblin_ReadBinary_FreeBinary(
LibGoblin_BinaryInfo *p_binfo )
{
+ int i_cnt;
+ LibGoblin_BinaryFile *p_bfile;
assert( NULL != p_binfo );
return -0x01;
}
- if( -0x01 != p_binfo->i_fd ) {
- munmap( p_binfo->pb_binary, p_binfo->dw_size );
- p_binfo->pb_binary = NULL;
- p_binfo->dw_size = 0;
+ for( i_cnt = 0; i_cnt < LIBGOBLIN_BINFO_MAXFILES; i_cnt++ ) {
+ p_bfile = &(p_binfo->t_binfile[ i_cnt ]);
+
+ if( -0x01 == p_bfile->i_fd ) { continue; }
+
+ if( LIBGOBLIN_BINFO_FILE_MMAP & p_bfile->dw_flag ) {
+ munmap( p_bfile->pb_binary, p_bfile->dw_size );
+ close( p_bfile->i_fd );
+ }
+ else if( LIBGOBLIN_BINFO_FILE_INTALLOC & p_bfile->dw_flag ) {
+ free( p_bfile->pb_binary );
+ close( p_bfile->i_fd );
+ }
- close( p_binfo->i_fd );
- p_binfo->i_fd = -0x01;
+ p_bfile->pb_binary = NULL;
+ p_bfile->dw_size = 0;
+ p_bfile->i_fd = -0x01;
}
p_binfo->b_phase = LIBGOBLIN_BINFO_PHASE_ALLOCED;
LIBGOBLIN_READBIN_EXTERN
int LibGoblin_ReadBinary_File(
- LibGoblin_BinaryInfo *p_binfo, const char *pstr_filepath );
+ LibGoblin_BinaryInfo *p_binfo, const char *pstr_filepath, int i_filetype );
LIBGOBLIN_READBIN_EXTERN
int LibGoblin_ReadBinary_Memory(
- LibGoblin_BinaryInfo *p_binfo, Byte *pb_data, DWord dw_size );
+ LibGoblin_BinaryInfo *p_binfo, Byte *pb_data, DWord dw_size, int i_filetype );
LIBGOBLIN_READBIN_EXTERN
int LibGoblin_ReadBinary_FreeBinary( LibGoblin_BinaryInfo *p_binfo );
#define LIBGOBLIN_BINFO_PHASE_BINREAD 0x02
#define LIBGOBLIN_BINFO_PHASE_ANALYZED 0x03
+#define LIBGOBLIN_BINFO_MAXFILES 3
+#define LIBGOBLIN_BINFO_FILE_EXEC 0
+#define LIBGOBLIN_BINFO_FILE_CORE 1
+#define LIBGOBLIN_BINFO_FILE_DEBUG 2
+
+#define LIBGOBLIN_BINFO_FILE_MMAP (DWord)0x01
+#define LIBGOBLIN_BINFO_FILE_EXTALLOC (DWord)0x02
+#define LIBGOBLIN_BINFO_FILE_INTALLOC (DWord)0x04
+
+
typedef struct {
/* Binary-File Info. */
int i_fd;
+ DWord dw_flag;
char str_filepath[DRD64_MAX_PATH];
+ LibFileType_FileType t_ftype;
/* Binary-File Memory Image Access Info. */
DWord dw_size;
/* Debug-Format Depending Info. (DWarf) */
void *p_debug;
- LibGoblin_BinaryFile t_bfile[3];
-
/* Exec. File ===========================================*/
- /* Binary-File Info. */
- int i_fd;
- char str_filepath[DRD64_MAX_PATH];
-
- /* Binary-File Memory Image Access Info. */
- DWord dw_size;
- Byte *pb_binary;
+ LibGoblin_BinaryFile t_binfile[3];
/* Binary-Format Depending Info. (ELF)*/
void *p_format;
p_binfo = LibGoblin_BinInfo_GetBinInfo( i_binfoid );
CU_ASSERT( NULL != p_binfo );
- i_result = LibGoblin_ReadBinary_File( p_binfo, "../dwarftest" );
+ i_result = LibGoblin_ReadBinary_File( p_binfo, "../dwarftest", LIBGOBLIN_BINFO_FILE_EXEC );
CU_ASSERT( 0x00 == i_result );
i_result = LibGoblin_ReadBinary_FreeBinary( p_binfo );
sz_read = read( i_fd, pb_data, t_sb.st_size );
CU_ASSERT( sz_read == t_sb.st_size );
- i_result = LibGoblin_ReadBinary_Memory( p_binfo, pb_data, t_sb.st_size );
+ i_result = LibGoblin_ReadBinary_Memory( p_binfo, pb_data, t_sb.st_size, LIBGOBLIN_BINFO_FILE_EXEC );
CU_ASSERT( 0x00 == i_result );
i_result = LibGoblin_ReadBinary_FreeBinary( p_binfo );