----------------------------------------------------------------------*/
LIBGOBLIN_DEBUG_ELF_EXTERN
int
+ Debug_ELF_PrintGlobalSectionTable(
+ LibGoblin_ProgramInfo *p_pginfo,
+ Byte b_level )
+{
+ Byte b_cnt;
+ void *p_shdr;
+ PtrValue ptr_start;
+ LibGoblin_SectionInfo *p_secinfo;
+ Elf64_Shdr *p_shdr64;
+ Elf32_Shdr *p_shdr32;
+
+ if( 0x00 < b_level )
+ { puts("[DEBUG] Section Table -----------------------------------------------"); }
+
+ for( b_cnt = 0; b_cnt < LIBGOBLIN_SECTION_ID_MAX; b_cnt++ ) {
+ p_secinfo = LibGoblin_Section_GetSectionInfo( p_pginfo, b_cnt );
+ assert( NULL != p_secinfo );
+ p_shdr = (void *)p_secinfo->pb_sechdr;
+
+ if(( LIBGOBLIN_SECTION_ID_DEFAULT_MAX < b_cnt ) && ( NULL == p_shdr ))
+ { break; }
+
+ if( NULL == p_shdr ) { continue; }
+
+ if( 0x00 < b_level ) {
+ if( 0 < p_secinfo->ptr_addr.value ) {
+ printf(" %02d: %08lx - %08lx (%8ld): %20s (FID:%d)\n", b_cnt,
+ p_secinfo->ptr_addr.value,
+ p_secinfo->ptr_addr.value + p_secinfo->qw_size, p_secinfo->qw_size,
+ p_secinfo->pstr_secname, p_secinfo->i_fid );
+ } else {
+ printf(" %02d: - (%8ld): %20s (FID:%d)\n", b_cnt,
+ p_secinfo->qw_size, p_secinfo->pstr_secname, p_secinfo->i_fid );
+ }
+ }
+
+ }
+
+ if( 0x00 < b_level ) {
+ puts("-----------------------------------------------------------------------");
+ puts("");
+ }
+
+ return 0x00;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+LIBGOBLIN_DEBUG_ELF_EXTERN
+int
LibGoblin_Debug_Elf_PrintSectionTable(
LibGoblin_BinaryInfo *p_binfo,
Byte b_level )
#endif
LIBGOBLIN_DEBUG_ELF_EXTERN
+ int Debug_ELF_PrintGlobalSectionTable(
+ LibGoblin_ProgramInfo *p_pginfo, Byte b_level );
+LIBGOBLIN_DEBUG_ELF_EXTERN
int LibGoblin_Debug_Elf_PrintSectionTable(
LibGoblin_BinaryInfo *p_binfo, Byte b_level );
#endif
LIBGOBLIN_DEBUG_OBJINFO_EXTERN
- int LibGoblin_Debug_Elf_PrintSectionTable(
- LibGoblin_BinaryInfo *p_binfo, Byte b_level );
+ int Debug_ObjectInfo_Print_AllGroupLink( LibGoblin_ProgramInfo *p_pginfo, Byte b_level );
+
#endif /* DRD64_HEADER_XXX */
LibGoblin_BinaryInfo *p_binfo )
{
int i_result = 0x00;
+ LibGoblin_ProgramInfo *p_pginfo;
assert( NULL != p_binfo );
return i_result;
}
+ p_pginfo = ProgInfo_GetProgInfo( p_binfo->i_pginfo );
+
/* Analyze ELF Basical Struct & data -----*/
if( LIBGOBLIN_BINFO_TYPE_ELF64 == p_binfo->b_type ) {
i_result = ELF64_Dynamic_GetDynStrSection_fromProgHdr( p_binfo );
if( 0x00 != i_result ) {
return -0x01;
}
+if( p_binfo->i_parent_bid == -1 ) { Debug_ELF_PrintGlobalSectionTable( p_pginfo, 0x01 ); }
i_result = ELF64_Section_ReadSectionInfo( p_binfo );
if( 0x00 > i_result ) {
return -0x02;
}
+if( p_binfo->i_parent_bid == -1 ) { Debug_ELF_PrintGlobalSectionTable( p_pginfo, 0x01 ); }
}
else if( LIBGOBLIN_BINFO_TYPE_ELF32 == p_binfo->b_type ) {
}
if( 0x00 > i_result ) {
return -0x02;
}
+if( p_binfo->i_parent_bid == -1 ) { Debug_ELF_PrintGlobalSectionTable( p_pginfo, 0x01 ); }
return i_result;
}
//p_bfile = BinaryFile_GetBinaryFile( p_binfo->i_binfile );
//pb_data = p_bfile->pb_binary;
//assert( NULL != pb_data );
+if( p_binfo->i_parent_bid == -1 ) { Debug_ELF_PrintGlobalSectionTable( p_pginfo, 0x01 ); }
/* Read Program Header to ObjectInfo ------------------*/
i_result = ELF_ProgramHeader_Read( p_pginfo, p_binfo );
if( 0x00 != i_result ) {
return i_result;
}
+if( p_binfo->i_parent_bid == -1 ) { Debug_ELF_PrintGlobalSectionTable( p_pginfo, 0x01 ); }
/* Inset SectionInfo to ObjectInfo ------------------*/
i_result = Section_InsetObjectInfo_fromSection( p_pginfo );
p_pghdr_dynstr = ELF64_ProgramHeader_Search_inRange( p_binfo, ptr_dynvalue, qw_dynsize );
assert( NULL != p_pghdr_dynstr );
+// XXX: 2019/02/04 BUG!!
p_sec_dynstr = LibGoblin_Section_GetSectionInfo( p_pginfo, LIBGOBLIN_SECTION_ID_DYNSTR );
p_sec_dynstr->qw_size = qw_dynsize;
p_sec_dynstr->ptr_addr.value = ptr_dynvalue;
}
/* Update Global SectionTable ---*/
- if( 0 <= p_binfo->i_pginfo ) {
+ if(( 0 <= p_binfo->i_pginfo ) && ( -0x01 == p_binfo->i_parent_bid )) {
p_pginfo = ProgInfo_GetProgInfo( p_binfo->i_pginfo );
Section_UpdateSectionInfo_inProgInfo( p_pginfo, p_binfo );
}
}
}
+
+ p_globsec = NULL;
for( i_cnt = LIBGOBLIN_SECTION_ID_DEFAULT_MAX;
i_cnt < LIBGOBLIN_SECTION_ID_MAX; i_cnt++ ) {
p_globsec->ptr_addr.value = p_sectbl->ptr_addr.value;
p_globsec->i_fid = p_sectbl->i_fid;
}
-
+
return 0x00;
}
// Update Global SectionTable ---
for( i_cnt = 0; i_cnt < LIBGOBLIN_SECTION_ID_MAX; i_cnt++ ) {
p_section = &(p_pginfo->t_section[i_cnt]);
+
if( NULL == p_section->pb_sechdr ) { continue; }
+ if( 0x00000000 == p_section->ptr_addr.value ) { continue; }
+
p_binfo = p_pginfo->p_binfo[ ((0x00 > p_section->i_fid) ? 0x00 : (p_section->i_fid) ) ];
assert( NULL != p_binfo );