/*----------------------------------------------------------------------
----------------------------------------------------------------------*/
+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;
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 ) {
/*----------------------------------------------------------------------
----------------------------------------------------------------------*/
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,
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 );
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;
}
}
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++;
}
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;
}
}
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;
#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
/*=====================================================================*/
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;