From feb21c9912cf3c5ae7ae0bfbb7bfc2735c429bee Mon Sep 17 00:00:00 2001 From: "Koine Yuusuke(koinec)" Date: Tue, 17 Nov 2015 21:35:16 +0900 Subject: [PATCH] * Implement: LibGoblin_AddrInfo_Set_Symtab() & surround functions. (Non-Tested, only 64bit) --- libgoblin/drd64_libgoblin_addrinfo.c | 49 +++++++++++++++++++++++++++++++++++- libgoblin/drd64_libgoblin_elf.c | 41 ++++++++++++++++++++++++++++++ libgoblin/drd64_libgoblin_elf.h | 3 +++ libgoblin/drd64_libgoblin_elf64.c | 12 ++++++--- libgoblin/drd64_libgoblin_section.h | 1 + libgoblin/drd64_libgoblin_type.h | 7 +++--- 6 files changed, 104 insertions(+), 9 deletions(-) diff --git a/libgoblin/drd64_libgoblin_addrinfo.c b/libgoblin/drd64_libgoblin_addrinfo.c index 67e8dc3..c1717d5 100644 --- a/libgoblin/drd64_libgoblin_addrinfo.c +++ b/libgoblin/drd64_libgoblin_addrinfo.c @@ -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 ) { diff --git a/libgoblin/drd64_libgoblin_elf.c b/libgoblin/drd64_libgoblin_elf.c index 12e8504..6c8949a 100644 --- a/libgoblin/drd64_libgoblin_elf.c +++ b/libgoblin/drd64_libgoblin_elf.c @@ -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, diff --git a/libgoblin/drd64_libgoblin_elf.h b/libgoblin/drd64_libgoblin_elf.h index 947b0ca..585b488 100644 --- a/libgoblin/drd64_libgoblin_elf.h +++ b/libgoblin/drd64_libgoblin_elf.h @@ -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 ); diff --git a/libgoblin/drd64_libgoblin_elf64.c b/libgoblin/drd64_libgoblin_elf64.c index 94a1de0..01cf435 100644 --- a/libgoblin/drd64_libgoblin_elf64.c +++ b/libgoblin/drd64_libgoblin_elf64.c @@ -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; diff --git a/libgoblin/drd64_libgoblin_section.h b/libgoblin/drd64_libgoblin_section.h index 97b25b3..9fd3d85 100644 --- a/libgoblin/drd64_libgoblin_section.h +++ b/libgoblin/drd64_libgoblin_section.h @@ -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 diff --git a/libgoblin/drd64_libgoblin_type.h b/libgoblin/drd64_libgoblin_type.h index b19c9f1..2971975 100644 --- a/libgoblin/drd64_libgoblin_type.h +++ b/libgoblin/drd64_libgoblin_type.h @@ -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; -- 2.11.0