OSDN Git Service

2019/02/04(Mon) 22:19
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Mon, 4 Feb 2019 13:18:59 +0000 (22:18 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Mon, 4 Feb 2019 13:18:59 +0000 (22:18 +0900)
 (LibGoblin)
  * WorkBackup

libgoblin/drd64_libgoblin_debug_elf.c
libgoblin/drd64_libgoblin_debug_elf.h
libgoblin/drd64_libgoblin_debug_objinfo.h
libgoblin/drd64_libgoblin_elf.c
libgoblin/drd64_libgoblin_elf_dynamic.c
libgoblin/drd64_libgoblin_elf_section.c
libgoblin/drd64_libgoblin_section.c

index e2226f7..40eafea 100644 (file)
@@ -42,6 +42,57 @@ Comment:
 ----------------------------------------------------------------------*/
 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 )
index 4d4577f..10300f3 100644 (file)
@@ -46,6 +46,9 @@ Comment:
 #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 );
 
index 629bf82..2911b48 100644 (file)
@@ -46,8 +46,8 @@ Comment:
 #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 */
index 74767fb..4748ad0 100644 (file)
@@ -98,6 +98,7 @@ int
                LibGoblin_BinaryInfo    *p_binfo )
 {
        int             i_result        = 0x00;
+       LibGoblin_ProgramInfo   *p_pginfo;
 
        assert( NULL != p_binfo );
 
@@ -107,17 +108,21 @@ int
                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 )        {
        }
@@ -126,6 +131,7 @@ int
        if( 0x00 > i_result )   {
                return -0x02;
        }
+if( p_binfo->i_parent_bid == -1 )      { Debug_ELF_PrintGlobalSectionTable( p_pginfo, 0x01 ); }
 
        return i_result;
 }
@@ -148,12 +154,14 @@ int
        //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 );
index daf63fb..48c4f53 100644 (file)
@@ -192,6 +192,7 @@ int
                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;
index f9856bc..5539605 100644 (file)
@@ -124,7 +124,7 @@ int
        }
 
        /* 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 );
        }
index e7dfd51..a47100d 100644 (file)
@@ -245,6 +245,8 @@ int
                }
 
        }
+
+       p_globsec       = NULL;
        
        for( i_cnt = LIBGOBLIN_SECTION_ID_DEFAULT_MAX;
                                                i_cnt < LIBGOBLIN_SECTION_ID_MAX; i_cnt++ )             {
@@ -269,7 +271,7 @@ int
                p_globsec->ptr_addr.value       = p_sectbl->ptr_addr.value;
                p_globsec->i_fid                        = p_sectbl->i_fid;
        }
-       
+
        return 0x00;
 }
 
@@ -292,8 +294,11 @@ int
        // 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 );