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
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.
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.
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
// 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;
// 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;
/*----------------------------------------------------------------------
+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 *
// 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;
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 );
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;
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;
}
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;
----------------------------------------------------------------------*/
LIBGOBLIN_SECTION_EXTERN
LibGoblin_SectionInfo *
- LibGoblin_Section_GetSectionInfo_fid(
+ Section_GetSectionInfo_fromBinaryInfo(
LibGoblin_BinaryInfo *p_binfo,
Byte b_secid )
{
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,
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(
#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
#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"
#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"