{
int i_result;
LibGoblin_ProgramInfo *p_pginfo;
+ LibGoblin_BinaryInfo *p_binfo;
p_pginfo = ProgInfo_GetProgInfo( i_pgid );
if( NULL == p_pginfo ) {
return -0x01;
}
- i_result = ELF_ReadELF_Phase2( p_pginfo, p_pginfo->p_binfo[LIBGOBLIN_BINFO_FILE_EXEC] );
- if( 0x00 != i_result ) {
+ p_binfo = BinaryInfo_GetBinInfo( p_pginfo->i_binfo_id );
+ if( NULL == p_binfo ) {
return -0x02;
}
+ i_result = ELF_ReadELF_Phase2( p_binfo );
+ if( 0x00 != i_result ) {
+ return -0x03;
+ }
+
return i_result;
}
return -0x02;
}
- p_binfo = p_pginfo->p_binfo[LIBGOBLIN_BINFO_FILE_EXEC];
+ p_binfo = BinaryInfo_GetBinInfo( p_pginfo->i_binfo_id );
while( NULL != p_binfo ) {
if( LIBGOBLIN_BINFO_PHASE_SETPROG > p_binfo->b_phase )
{ break; }
LibGoblin_BinaryInfo *p_binfo,
Byte b_level )
{
- Word w_scope;
- Word w_type;
- DWord dw_cnt;
- LibGoblin_AddressInfo *p_addr;
- LibGoblin_ProgramInfo *p_pginfo;
-
- assert( NULL != p_binfo );
- p_pginfo = ProgInfo_GetProgInfo( p_binfo->i_pginfo );
if( 0x00 < b_level )
{ puts("[DEBUG] Address Info. Table -------------------------------------------"); }
- p_addr = p_binfo->p_addrinfo;
- if( NULL == p_addr ) {
- if( 0x00 < b_level ) { puts(" Not exist Address Table."); }
- return 0x01;
- }
-
- for( dw_cnt = 0; dw_cnt < p_binfo->dw_max_addrinfo; dw_cnt++, p_addr++ ) {
- if( 0x00 < b_level ) {
- printf(" %08lx - %08lx (%8d) ", p_addr->ptr_addr.value,
- p_addr->ptr_addr.value + p_addr->dw_size, p_addr->dw_size );
-
- // b_elf_flags
- w_scope = p_addr->b_elf_flags >> 4;
- if( STB_GLOBAL == w_scope ) { printf( "[Global:" ); }
- else if( STB_WEAK == w_scope ) { printf( "[Weak :" ); }
- else if( STB_LOCAL == w_scope ) { printf( "[Local :" ); }
- else { printf( "[Other :" ); }
-
- w_type = p_addr->b_elf_flags & 0x0f;
- switch( w_type ) {
- case STT_NOTYPE: printf( "No Type ] " ); break;
- case STT_OBJECT: printf( "Object ] " ); break;
- case STT_FUNC: printf( "Function] " ); break;
- case STT_SECTION: printf( "Section ] " ); break;
- case STT_FILE: printf( "File ] " ); break;
- case STT_COMMON: printf( "Common ] " ); break;
- case STT_TLS: printf( "TLS ] " ); break;
- case STT_NUM: printf( "Number ] " ); break;
- default: printf( "(Other) ] " ); break;
- }
-
- // pstr_name
- printf( "%30s ", p_addr->pstr_name );
- if( STT_SECTION == w_type ) {
- printf("\n");
- continue;
- }
-
- // dw_srcid
- // w_secid
- if( SHN_ABS == p_addr->w_secid ) { printf("(ABS)"); }
- else if( SHN_COMMON == p_addr->w_secid ) { printf("(Common)"); }
- else if( SHN_XINDEX == p_addr->w_secid ) { printf("(XIndex)"); }
- else if( SHN_UNDEF == p_addr->w_secid ) { printf("(UNDEF)"); }
- else if( LIBGOBLIN_SECTION_ID_MAX > p_addr->w_secid ) {
- printf("(%s)",
- LibGoblin_Section_GetSectionName( p_pginfo, p_addr->w_secid ));
- }
- else { printf("(NO SHNDX)%d", p_addr->w_secid); }
- // dw_next
- printf("\n");
- }
- }
if( 0x00 < b_level ) {
puts("-----------------------------------------------------------------------");
LIBGOBLIN_ELF_EXTERN
int
ELF_ReadELF_Phase2(
- LibGoblin_ProgramInfo *p_pginfo,
LibGoblin_BinaryInfo *p_binfo )
{
int i_result;
+ LibGoblin_ProgramInfo *p_pginfo;
assert( NULL != p_binfo );
+ p_pginfo = ProgInfo_GetProgInfo( p_binfo->i_pginfo );
+ assert( NULL != p_pginfo );
+
// XXX - for DEV/DEBUG
p_binfo->ptr_loadbase = 0x00000000800000000;
LIBGOBLIN_ELF_EXTERN
int ELF_ReadELF_Phase1( LibGoblin_BinaryInfo *p_binfo );
LIBGOBLIN_ELF_EXTERN
- int ELF_ReadELF_Phase2( LibGoblin_ProgramInfo *p_pginfo, LibGoblin_BinaryInfo *p_binfo );
+ int ELF_ReadELF_Phase2( LibGoblin_BinaryInfo *p_binfo );
#endif /* DRD64_HEADER_LIBGOBLIN_BINFO */
/*----------------------------------------------------------------------
----------------------------------------------------------------------*/
LIBGOBLIN_PROGINFO_EXTERN
-int
- ProgInfo_GetBinaryInfos(
- LibGoblin_ProgramInfo *p_pginfo )
-{
- assert( NULL != p_pginfo );
-
- return p_pginfo->i_num_binfo;
-}
-
-
-/*----------------------------------------------------------------------
-----------------------------------------------------------------------*/
-LIBGOBLIN_PROGINFO_EXTERN
LibGoblin_BinaryInfo *
ProgInfo_AddBinaryInfo(
LibGoblin_ProgramInfo *p_pginfo,
if( -1 == i_req_bid ) {
p_binfo->i_filetype = LIBGOBLIN_BINFO_FILE_EXEC;
- p_pginfo->p_binfo[LIBGOBLIN_BINFO_FILE_EXEC] = p_binfo;
+ p_pginfo->i_binfo_id = p_binfo->i_id;
}
else {
p_binfo->i_filetype = LIBGOBLIN_BINFO_FILE_LIBRARY;
}
- p_pginfo->i_num_binfo++;
return p_binfo;
}
LIBGOBLIN_PROGINFO_EXTERN
LibGoblin_ProgramInfo *ProgInfo_GetProgInfo( int i_pgid );
LIBGOBLIN_PROGINFO_EXTERN
- int ProgInfo_GetBinaryInfos( LibGoblin_ProgramInfo *p_pginfo );
-LIBGOBLIN_PROGINFO_EXTERN
LibGoblin_BinaryInfo *ProgInfo_AddBinaryInfo(
LibGoblin_ProgramInfo *p_pginfo, const char *pstr_binfilename, int i_req_bid );
LIBGOBLIN_PROGINFO_EXTERN
if( 0x00000000 == p_section->ptr_addr.value ) { continue; }
- p_binfo = p_pginfo->p_binfo[ ((0x00 > p_section->i_fid) ? 0x00 : (p_section->i_fid) ) ];
+ // XXX 2019/03/23 temporary!
+ p_binfo = BinaryInfo_GetBinInfo( p_pginfo->i_binfo_id );
assert( NULL != p_binfo );
// sh_addr - Address in memory image.
int i_binfile; // binaryFile ID
+
int i_pginfo;
int i_binfo_parent;
int i_binfo_next;
PtrValue ptr_loadbase;
+ LibGoblin_SectionInfo t_section[LIBGOBLIN_SECTION_ID_MAX];
+
/* Binary-Format Depending Info. (ELF)*/
//void *p_format;
int i_id;
- int i_num_binfo;
- LibGoblin_BinaryInfo *p_binfo[LIBGOBLIN_BINFO_MAXFILES];
-
- LibGoblin_SectionInfo t_section[LIBGOBLIN_SECTION_ID_MAX];
-
- /* Address Table Info. */
- //LibGoblin_AddressInfo *p_addrinfo;
- //DWord dw_alloc_addrinfo;
- //DWord dw_max_addrinfo;
-
// Object Table & Address Table ---
struct {
LibGoblin_ObjectInfo *p_objinfo;
} objinfo;
LibGoblin_AddressInfo *p_addrinfo;
+ Word dw_flag;
+
+ int i_binfo_id;
+
+ LibGoblin_SectionInfo t_section[LIBGOBLIN_SECTION_ID_MAX];
- DWord dw_flag;
+ /* Address Table Info. */
+ //LibGoblin_AddressInfo *p_addrinfo;
+ //DWord dw_alloc_addrinfo;
+ //DWord dw_max_addrinfo;
+
} LibGoblin_ProgramInfo;