OSDN Git Service

2019/03/10(Sun) 12:19
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sun, 10 Mar 2019 03:19:12 +0000 (12:19 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sun, 10 Mar 2019 03:19:12 +0000 (12:19 +0900)
 (LibGoblin)
  * WorkBackup

libgoblin/drd64_libgoblin_elf_dynamic.c
libgoblin/drd64_libgoblin_elf_dynsym.c
libgoblin/drd64_libgoblin_elf_gnuver.c
libgoblin/drd64_libgoblin_elf_gnuver.h
libgoblin/drd64_libgoblin_elf_hash.c
libgoblin/drd64_libgoblin_elf_symtab.c
libgoblin/drd64_libgoblin_section.c
libgoblin/drd64_libgoblin_section.h
libgoblin/drd64_libgoblin_section_defs.h

index f202c77..438c75a 100644 (file)
@@ -194,7 +194,7 @@ int
                p_pghdr_dynstr  = ELF64_ProgramHeader_Search_inRange( p_binfo, ptr_dynvalue, qw_dynsize );
                assert( NULL != p_pghdr_dynstr );
 
-               p_sec_dynstr    = LibGoblin_Section_GetSectionInfo_fid( p_binfo, LIBGOBLIN_SECTION_ID_DYNSTR );
+               p_sec_dynstr    = Section_GetSectionInfo_fromBinaryInfo( p_binfo, LIBGOBLIN_SECTION_ID_DYNSTR );
                p_sec_dynstr->qw_size                   = qw_dynsize;
                p_sec_dynstr->ptr_addr.value    = ptr_dynvalue;
                p_sec_dynstr->pb_data                   = pb_data
@@ -220,7 +220,7 @@ void
        LibGoblin_SectionInfo   *p_secnow;
        LibGoblin_BinaryFile    *p_bfile;
 
-       p_secnow        = LibGoblin_Section_GetSectionInfo_fid( p_binfo, dw_secid );
+       p_secnow        = Section_GetSectionInfo_fromBinaryInfo( p_binfo, dw_secid );
        if( NULL == p_secnow->pb_sechdr )       {
                p_secnow->qw_size       = qw_value;
                p_secnow->i_fid         = -0x01;        // Temporary.
@@ -256,7 +256,7 @@ void
        LibGoblin_SectionInfo   *p_secnow;
        LibGoblin_BinaryFile    *p_bfile;
 
-       p_secnow        = LibGoblin_Section_GetSectionInfo_fid( p_binfo, dw_secid );
+       p_secnow        = Section_GetSectionInfo_fromBinaryInfo( p_binfo, dw_secid );
        if( NULL == p_secnow->pb_sechdr )       {
                p_secnow->ptr_addr.value        = ptr_value;
                p_secnow->i_fid                         = -0x01;        // Temporary.
@@ -306,20 +306,22 @@ int
        p_pginfo        = ProgInfo_GetProgInfo( p_binfo->i_pginfo );
 
        // Read & Check SectionInfo ---
-       p_sec_dynamic   = LibGoblin_Section_GetSectionInfo_fid(
-                                               p_binfo, LIBGOBLIN_SECTION_ID_DYNAMIC );
-       if( NULL == p_sec_dynamic )             {
+       p_sec_dynamic   = Section_GetSectionInfo_fromBinaryInfo(
+                                                       p_binfo, LIBGOBLIN_SECTION_ID_DYNAMIC );
+       assert( NULL != p_sec_dynamic );
+       if( NULL == p_sec_dynamic->pb_data )    {
                return 0x01;
        }
+       pb_data = p_sec_dynamic->pb_data;
 
-       p_sec_dynstr    = LibGoblin_Section_GetSectionInfo_fid(
+       p_sec_dynstr    = Section_GetSectionInfo_fromBinaryInfo(
                                                p_binfo, LIBGOBLIN_SECTION_ID_DYNSTR );
-       if( NULL == p_sec_dynstr )              {
+       assert( NULL != p_sec_dynstr );
+       if( NULL == p_sec_dynstr->pb_data )             {
                return 0x02;
        }
        pb_dynstr       = p_sec_dynstr->pb_data;
 
-       pb_data = p_sec_dynamic->pb_data;
        if( IsBinfoType_Elf64( p_binfo ) )
                { i_sz_elfdyn   = sizeof( Elf64_Dyn ); }
        else
index 72c710f..8b71775 100644 (file)
@@ -69,17 +69,18 @@ int
 
 
        // Check exist .dynsym section ---
-       psec_dynsym     = LibGoblin_Section_GetSectionInfo_fid(
+       psec_dynsym     = Section_GetSectionInfo_fromBinaryInfo(
                                                        p_binfo, LIBGOBLIN_SECTION_ID_DYNSYM );
-       if( NULL == psec_dynsym )       {
+       assert( NULL != psec_dynsym );
+       if( NULL == psec_dynsym->pb_sechdr )    {
                return 0x00;
        }
        p_shdr  = (Elf64_Shdr *)(psec_dynsym->pb_sechdr);
-       assert( NULL != p_shdr );
 
-       psec_dynstr     = LibGoblin_Section_GetSectionInfo_fid(
+       psec_dynstr     = Section_GetSectionInfo_fromBinaryInfo(
                                                        p_binfo, LIBGOBLIN_SECTION_ID_DYNSTR );
-       if( NULL == psec_dynstr )       {
+       assert( NULL != psec_dynstr );
+       if( NULL == psec_dynstr->pb_data )      {
                return 0x00;
        }
        pb_dynstr       = psec_dynstr->pb_data;
@@ -87,9 +88,10 @@ int
        // Read & Generate DynSym_Version struct data ---
        p_verneed       = ELF64_GnuVer_GenerateGnuVerNeed( &dw_vermax, p_binfo );
        if( NULL != p_verneed ) {
-               psec_gnuver     = LibGoblin_Section_GetSectionInfo_fid(
+               psec_gnuver     = Section_GetSectionInfo_fromBinaryInfo(
                                                                p_binfo, LIBGOBLIN_SECTION_ID_GNU_VERSION );
-               if( NULL == psec_gnuver )       {
+               assert( NULL != psec_gnuver );
+               if( NULL == psec_gnuver->pb_data )      {
                        return 0x00;
                }
                pw_gnuver       = (Word *)psec_gnuver->pb_data;
index 796e60a..730e52e 100644 (file)
@@ -39,6 +39,47 @@ Comment:
 
 
 /*----------------------------------------------------------------------
+Section: .gnu.version_d
+----------------------------------------------------------------------*/
+LIBGOBLIN_ELF_GNUVER_EXTERN
+int
+       ELF64_GnuVer_CheckVerName_inVerDef(
+                       LibGoblin_BinaryInfo    *p_binfo,
+                       char    *pstr_vername,
+                       Word    w_version )
+{
+       int             i_result        = 0x00;
+       //Byte  *pb_gnuver_d;
+       Byte    *pb_dynstr;
+       Elf64_Verdef    *pelf_verdef;
+       LibGoblin_SectionInfo   *psec_dynstr;
+       LibGoblin_SectionInfo   *psec_gnuver_d;
+
+       psec_gnuver_d   = Section_GetSectionInfo_fromBinaryInfo(
+                                                       p_binfo, LIBGOBLIN_SECTION_ID_GNU_VERSION_D );
+       assert( NULL != psec_gnuver_d );
+       if( NULL == psec_gnuver_d->pb_data )
+               { goto  goto_ELF64_GnuVer_CheckVerName_inVerDef_post; }
+
+       //pb_gnuver_d   = psec_gnuver_d->pb_data;
+       pelf_verdef     = (Elf64_Verdef *)psec_gnuver_d->pb_data;
+
+       psec_dynstr     = Section_GetSectionInfo_fromBinaryInfo(
+                                                       p_binfo, LIBGOBLIN_SECTION_ID_DYNSTR );
+       assert( NULL != psec_dynstr );
+       if( NULL == psec_dynstr->pb_data )
+               { goto  goto_ELF64_GnuVer_CheckVerName_inVerDef_post; }
+       pb_dynstr       = psec_dynstr->pb_data;
+
+
+printf(" %s next = %xh\n", p_binfo->str_filename, pelf_verdef->vd_next );
+
+goto_ELF64_GnuVer_CheckVerName_inVerDef_post:
+       return i_result;
+}
+
+
+/*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
 LIBGOBLIN_ELF_GNUVER_EXTERN
 GnuVer_VerNeed *
@@ -64,22 +105,25 @@ GnuVer_VerNeed *
 
 
        // Check exist .dynsym section ---
-       psec_dynsym     = LibGoblin_Section_GetSectionInfo_fid(
+       psec_dynsym     = Section_GetSectionInfo_fromBinaryInfo(
                                                        p_binfo, LIBGOBLIN_SECTION_ID_DYNSYM );
-       if( NULL == psec_dynsym )
+       assert( NULL != psec_dynsym );
+       if( NULL == psec_dynsym->pb_sechdr )
                { goto  goto_ELF64_GnuVer_GenerateGnuVerNeed_post; }
        p_shdr  = (Elf64_Shdr *)(psec_dynsym->pb_sechdr);
        assert( NULL != p_shdr );
 
-       psec_dynstr     = LibGoblin_Section_GetSectionInfo_fid(
+       psec_dynstr     = Section_GetSectionInfo_fromBinaryInfo(
                                                        p_binfo, LIBGOBLIN_SECTION_ID_DYNSTR );
-       if( NULL == psec_dynstr )
+       assert( NULL != psec_dynstr );
+       if( NULL == psec_dynstr->pb_data )
                { goto  goto_ELF64_GnuVer_GenerateGnuVerNeed_post; }
        pb_dynstr       = psec_dynstr->pb_data;
 
-       psec_gnuver_r   = LibGoblin_Section_GetSectionInfo_fid(
+       psec_gnuver_r   = Section_GetSectionInfo_fromBinaryInfo(
                                                        p_binfo, LIBGOBLIN_SECTION_ID_GNU_VERSION_R );
-       if( NULL == psec_gnuver_r )
+       assert( NULL != psec_gnuver_r );
+       if( NULL == psec_gnuver_r->pb_data )
                { goto  goto_ELF64_GnuVer_GenerateGnuVerNeed_post; }
        pb_gnuver_r     = psec_gnuver_r->pb_data;
 
index 57bebe6..446b215 100644 (file)
@@ -57,8 +57,13 @@ typedef struct       {
        int     i_binfo_id;
 } GnuVer_VerNeed;
 
+
+LIBGOBLIN_ELF_GNUVER_EXTERN
+       int ELF64_GnuVer_CheckVerName_inVerDef(
+                       LibGoblin_BinaryInfo *p_binfo, char *pstr_vername, Word w_version );
 LIBGOBLIN_ELF_GNUVER_EXTERN
-       GnuVer_VerNeed *ELF64_GnuVer_GenerateGnuVerNeed( DWord *dw_maxver, LibGoblin_BinaryInfo *p_binfo );
+       GnuVer_VerNeed *ELF64_GnuVer_GenerateGnuVerNeed(
+                       DWord *dw_maxver, LibGoblin_BinaryInfo *p_binfo );
 LIBGOBLIN_ELF_GNUVER_EXTERN
        void ELF64_GnuVer_FreeGnuVerNeed( GnuVer_VerNeed *p_gnuver );
 
index a37b092..9ddd4c1 100644 (file)
@@ -81,24 +81,27 @@ int
        Elf64_Sym                               *p_symnow;              //const Sym  *sym;
 
 
-       psec_dynsym     = LibGoblin_Section_GetSectionInfo_fid(
+       psec_dynsym     = Section_GetSectionInfo_fromBinaryInfo(
                                                        p_binfo, LIBGOBLIN_SECTION_ID_DYNSYM );
-       if( NULL == psec_dynsym )       {
+       assert( NULL != psec_dynsym );
+       if( NULL == psec_dynsym->pb_data )      {
                return -0x01;
        }
        pb_dynsym       = psec_dynsym->pb_data;
        p_dynsym        = (Elf64_Sym *)pb_dynsym;
 
-       psec_dynstr     = LibGoblin_Section_GetSectionInfo_fid(
+       psec_dynstr     = Section_GetSectionInfo_fromBinaryInfo(
                                                        p_binfo, LIBGOBLIN_SECTION_ID_DYNSTR );
-       if( NULL == psec_dynstr )       {
+       assert( NULL != psec_dynstr );
+       if( NULL == psec_dynstr->pb_data )      {
                return -0x01;
        }
        pb_dynstr       = psec_dynstr->pb_data;
 
-       psec_gnuhash    = LibGoblin_Section_GetSectionInfo_fid(
+       psec_gnuhash    = Section_GetSectionInfo_fromBinaryInfo(
                                                        p_binfo, LIBGOBLIN_SECTION_ID_GNU_HASH );
-       if( NULL == psec_gnuhash )      {
+       assert( NULL != psec_gnuhash );
+       if( NULL == psec_gnuhash->pb_data )     {
                return -0x01;
        }
        pb_gnuhash      = psec_gnuhash->pb_data;
@@ -131,6 +134,7 @@ int
 
 
                if(((dw_namehash | 1) == (dw_hash | 1)) && !strcmp(pstr_dynname, pstr_symname)) {
+                       ELF64_GnuVer_CheckVerName_inVerDef( p_binfo, pstr_vername, 0);
                        i_ret   = dw_symix & 0x7fffffff;
                        break;
                }
index eeab16a..2086850 100644 (file)
@@ -62,16 +62,18 @@ int
        assert( NULL != p_binfo );
 
        // Check BinaryInfo & Get SymbolEntires
-       p_secinfo       = LibGoblin_Section_GetSectionInfo_fid(
+       p_secinfo       = Section_GetSectionInfo_fromBinaryInfo(
                                                        p_binfo, LIBGOBLIN_SECTION_ID_SYMTAB );
-       if( NULL == p_secinfo ) {
+       assert( NULL != p_secinfo );
+       if( NULL == p_secinfo->pb_data )        {
                return 0x00;
        }
        pb_symtab       = p_secinfo->pb_data;
 
-       p_secstr        = LibGoblin_Section_GetSectionInfo_fid(
+       p_secstr        = Section_GetSectionInfo_fromBinaryInfo(
                                                        p_binfo, LIBGOBLIN_SECTION_ID_STRTAB );
-       if( NULL == p_secstr )  {
+       assert( NULL != p_secstr );
+       if( NULL == p_secstr->pb_data ) {
                return 0x00;
        }
        pb_strtab       = p_secstr->pb_data;
index 3adff2c..51df8f5 100644 (file)
@@ -78,7 +78,7 @@ LibGoblin_SectionInfo *
 ----------------------------------------------------------------------*/
 LIBGOBLIN_SECTION_EXTERN
 LibGoblin_SectionInfo *
-       LibGoblin_Section_GetSectionInfo_fid(
+       Section_GetSectionInfo_fromBinaryInfo(
                        LibGoblin_BinaryInfo    *p_binfo,
                        Byte    b_secid )
 {
index dcc2b1d..d54c164 100644 (file)
@@ -72,6 +72,7 @@ Comment:
                LIBGOBLIN_SECTION_STR_COMMENT,
                LIBGOBLIN_SECTION_STR_GNU_VERSION,
                LIBGOBLIN_SECTION_STR_GNU_VERSION_R,
+               LIBGOBLIN_SECTION_STR_GNU_VERSION_D,
                LIBGOBLIN_SECTION_STR_RODATA,
                LIBGOBLIN_SECTION_STR_NOTE_ABI_TAG,
                LIBGOBLIN_SECTION_STR_HASH,
@@ -108,7 +109,7 @@ LIBGOBLIN_SECTION_EXTERN
        LibGoblin_SectionInfo *LibGoblin_Section_GetSectionInfo(
                        LibGoblin_ProgramInfo *p_pginfo, Byte b_secid );
 LIBGOBLIN_SECTION_EXTERN
-       LibGoblin_SectionInfo *LibGoblin_Section_GetSectionInfo_fid(
+       LibGoblin_SectionInfo *Section_GetSectionInfo_fromBinaryInfo(
                        LibGoblin_BinaryInfo *p_binfo, Byte b_secid );
 LIBGOBLIN_SECTION_EXTERN
        Word LibGoblin_Section_GetSectionID_fromSectionNumber_inElf(
index e8d214a..74809ec 100644 (file)
@@ -37,8 +37,8 @@ Comment:
 #ifndef DRD64_HEADER_LIBGOBLIN_SECTION_DEFS
 #define DRD64_HEADER_LIBGOBLIN_SECTION_DEFS
 
-#define        LIBGOBLIN_SECTION_ID_DEFAULT_MAX        0x2f
-#define        LIBGOBLIN_SECTION_ID_MAX                        0x4f
+#define        LIBGOBLIN_SECTION_ID_DEFAULT_MAX        0x30
+#define        LIBGOBLIN_SECTION_ID_MAX                        0x7f
 #define        LIBGOBLIN_SECTION_ID_INVALID            0xff
 
 #define        LIBGOBLIN_SECTION_ID_NULL                       0x00
@@ -65,30 +65,31 @@ Comment:
 #define        LIBGOBLIN_SECTION_ID_COMMENT            0x15
 #define        LIBGOBLIN_SECTION_ID_GNU_VERSION        0x16
 #define        LIBGOBLIN_SECTION_ID_GNU_VERSION_R      0x17
-#define        LIBGOBLIN_SECTION_ID_RODATA                     0x18
-#define        LIBGOBLIN_SECTION_ID_NOTE_ABI_TAG       0x19
-#define        LIBGOBLIN_SECTION_ID_HASH                       0x1a
-#define        LIBGOBLIN_SECTION_ID_INTERP                     0x1b
-#define        LIBGOBLIN_SECTION_ID_JCR                        0x1c
-#define        LIBGOBLIN_SECTION_ID_DEBUG_ABBREV       0x1d
-#define        LIBGOBLIN_SECTION_ID_DEBUG_INFO         0x1e
-#define        LIBGOBLIN_SECTION_ID_DEBUG_LINE         0x1f
-#define        LIBGOBLIN_SECTION_ID_DEBUG_ARANGES      0x20
-#define        LIBGOBLIN_SECTION_ID_DEBUG_FRAME        0x21
-#define        LIBGOBLIN_SECTION_ID_DEBUG_LOC          0x22
-#define        LIBGOBLIN_SECTION_ID_DEBUG_PUBNAMES     0x23
-#define        LIBGOBLIN_SECTION_ID_DEBUG_STR          0x24
-#define        LIBGOBLIN_SECTION_ID_DEBUG_RANGES       0x25
-#define        LIBGOBLIN_SECTION_ID_DEBUG_MACINFO      0x26
-#define        LIBGOBLIN_SECTION_ID_DEBUG_PUBTYPES     0x27
-#define        LIBGOBLIN_SECTION_ID_NOTE_TAG           0x28
-#define        LIBGOBLIN_SECTION_ID_GNU_HASH           0x29
-#define        LIBGOBLIN_SECTION_ID_RELA_DYN           0x2a
-#define        LIBGOBLIN_SECTION_ID_TDATA                      0x2b
-#define        LIBGOBLIN_SECTION_ID_TBSS                       0x2c
-#define        LIBGOBLIN_SECTION_ID_DATA_REL_RO        0x2d
-#define        LIBGOBLIN_SECTION_ID_INIT_ARRAY         0x2e
-#define        LIBGOBLIN_SECTION_ID_FINI_ARRAY         0x2f
+#define        LIBGOBLIN_SECTION_ID_GNU_VERSION_D      0x18
+#define        LIBGOBLIN_SECTION_ID_RODATA                     0x19
+#define        LIBGOBLIN_SECTION_ID_NOTE_ABI_TAG       0x1a
+#define        LIBGOBLIN_SECTION_ID_HASH                       0x1b
+#define        LIBGOBLIN_SECTION_ID_INTERP                     0x1c
+#define        LIBGOBLIN_SECTION_ID_JCR                        0x1d
+#define        LIBGOBLIN_SECTION_ID_DEBUG_ABBREV       0x1e
+#define        LIBGOBLIN_SECTION_ID_DEBUG_INFO         0x1f
+#define        LIBGOBLIN_SECTION_ID_DEBUG_LINE         0x20
+#define        LIBGOBLIN_SECTION_ID_DEBUG_ARANGES      0x21
+#define        LIBGOBLIN_SECTION_ID_DEBUG_FRAME        0x22
+#define        LIBGOBLIN_SECTION_ID_DEBUG_LOC          0x23
+#define        LIBGOBLIN_SECTION_ID_DEBUG_PUBNAMES     0x24
+#define        LIBGOBLIN_SECTION_ID_DEBUG_STR          0x25
+#define        LIBGOBLIN_SECTION_ID_DEBUG_RANGES       0x26
+#define        LIBGOBLIN_SECTION_ID_DEBUG_MACINFO      0x27
+#define        LIBGOBLIN_SECTION_ID_DEBUG_PUBTYPES     0x28
+#define        LIBGOBLIN_SECTION_ID_NOTE_TAG           0x29
+#define        LIBGOBLIN_SECTION_ID_GNU_HASH           0x2a
+#define        LIBGOBLIN_SECTION_ID_RELA_DYN           0x2b
+#define        LIBGOBLIN_SECTION_ID_TDATA                      0x2c
+#define        LIBGOBLIN_SECTION_ID_TBSS                       0x2d
+#define        LIBGOBLIN_SECTION_ID_DATA_REL_RO        0x2e
+#define        LIBGOBLIN_SECTION_ID_INIT_ARRAY         0x2f
+#define        LIBGOBLIN_SECTION_ID_FINI_ARRAY         0x30
 
 #define        LIBGOBLIN_SECTION_STR_NULL                              ""
 #define        LIBGOBLIN_SECTION_STR_TEXT                              ".text"
@@ -114,6 +115,7 @@ Comment:
 #define        LIBGOBLIN_SECTION_STR_COMMENT                   ".comment"
 #define        LIBGOBLIN_SECTION_STR_GNU_VERSION               ".gnu.version"
 #define        LIBGOBLIN_SECTION_STR_GNU_VERSION_R             ".gnu.version_r"
+#define        LIBGOBLIN_SECTION_STR_GNU_VERSION_D             ".gnu.version_d"
 #define        LIBGOBLIN_SECTION_STR_RODATA                    ".rodata"
 #define        LIBGOBLIN_SECTION_STR_NOTE_ABI_TAG              ".note.ABI-tag"
 #define        LIBGOBLIN_SECTION_STR_HASH                              ".hash"