}
printf(" debug: [%2u] %s (%s) = %d\n", dw_sym, pstr_symname, p_binlib->str_filename, i_result );
+ if( 0 > i_result ) { continue; }
+ p_obj = ObjectInfo_SearchDynamicSymbol( p_pginfo, (PtrValue)p_sym->st_value, pstr_symname );
+ if( NULL == p_obj ) {
+ // st_value - Symbol value.
+ // st_size - Size of associated object.
+ p_obj = ObjectInfo_InsetObject( p_pginfo,
+ (PtrValue)p_sym->st_value, (QWord)p_sym->st_size, NULL, 0x01 );
+ }
+
+ assert( NULL != p_obj );
// 2019/03/05 -- TODO
// Set Info. for ObjectInfo
/*
- // st_value - Symbol value.
- // st_size - Size of associated object.
- p_obj = ObjectInfo_InsetObject( p_pginfo,
- (PtrValue)p_sym->st_value, (QWord)p_sym->st_size, NULL, 0x01 );
// st_name - String table index of name.
p_obj->pstr_name = (char *)(pb_strtab + p_sym->st_name);
/*----------------------------------------------------------------------
----------------------------------------------------------------------*/
LIBGOBLIN_ELF_SYMTAB_EXTERN
+LibGoblin_ObjectInfo *
+ ELF64_Symtab_RegistSymbol_toObjectInfo(
+ LibGoblin_ProgramInfo *p_pginfo,
+ Elf64_Sym *p_sym,
+ Byte *pb_strtab )
+{
+ LibGoblin_SrcFile *p_srcfile;
+ LibGoblin_ObjectInfo *p_obj = NULL;
+
+ if(( 0x00000000 == p_sym->st_value )
+ && ( STT_NOTYPE == ELF64_ST_TYPE( p_sym->st_info ) ))
+ { goto goto_ELF64_Symtab_RegistSymbol_toObjectInfo_post; }
+
+ // Source file.
+ if( STT_FILE == ELF64_ST_TYPE( p_sym->st_info ) ) {
+ p_srcfile = SrcFile_DispenseSrcFile( (char *)pb_strtab + p_sym->st_name );
+ assert( NULL != p_srcfile );
+ goto goto_ELF64_Symtab_RegistSymbol_toObjectInfo_post;
+ }
+
+
+ // st_value - Symbol value.
+ // st_size - Size of associated object.
+ p_obj = ObjectInfo_InsetObject( p_pginfo,
+ (PtrValue)p_sym->st_value, (QWord)p_sym->st_size, NULL, 0x01 );
+
+ // st_name - String table index of name.
+ p_obj->pstr_name = (char *)(pb_strtab + p_sym->st_name);
+ p_obj->dw_hash = Common_CalcDJBhash( (char *)(pb_strtab + p_sym->st_name) );
+
+ // st_info - Type and binding information.
+ p_obj->info.symbol.b_type = ELF64_ST_TYPE( p_sym->st_info );
+ switch( ELF64_ST_TYPE( p_sym->st_info ) ) {
+ // Unspecified type.
+ case STT_NOTYPE:
+ p_obj->b_type = OBJINFO_TYPE_NULL; break;
+ // Data object.
+ case STT_OBJECT:
+ p_obj->b_type = OBJINFO_TYPE_OBJECT; break;
+ // Function.
+ case STT_FUNC:
+ p_obj->b_type = OBJINFO_TYPE_FUNCTION; break;
+ // Section.
+ case STT_SECTION:
+ p_obj->b_type = OBJINFO_TYPE_SECTION; break;
+ // Uninitialized common block.
+ case STT_COMMON:
+ p_obj->b_type = OBJINFO_TYPE_COMMON; break;
+ // TLS object.
+ case STT_TLS:
+ p_obj->b_type = OBJINFO_TYPE_TLS; break;
+ default:
+ p_obj->b_type = OBJINFO_TYPE_NULL; break;
+ }
+
+ // st_info - Type and binding information.
+ p_obj->info.symbol.b_binding = ELF64_ST_BIND( p_sym->st_info );
+
+ // st_other - Reserved (not used).
+ p_obj->info.symbol.b_visibility = p_sym->st_other;
+
+ // st_shndx - Section index of symbol.
+ p_obj->info.symbol.w_secindex = p_sym->st_shndx;
+ if(( SHN_UNDEF == p_sym->st_shndx ) && ( STT_NOTYPE != ELF64_ST_TYPE( p_sym->st_info ) ))
+ { p_obj->b_status |= OBJINFO_STATUS_DYNAMIC; }
+
+goto_ELF64_Symtab_RegistSymbol_toObjectInfo_post:
+ return p_obj;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+LIBGOBLIN_ELF_SYMTAB_EXTERN
int
ELF64_Symtab_ReadSection(
LibGoblin_BinaryInfo *p_binfo )
p_sym = (Elf64_Sym *)pb_symtab;
for( dw_cnt = 0; ((dw_cnt < dw_symbols) && (0x00 == i_result)); dw_cnt++, p_sym++ ) {
-
+ ELF64_Symtab_RegistSymbol_toObjectInfo( p_pginfo, p_sym, pb_strtab );
+/*
// Source file.
if( STT_FILE == ELF64_ST_TYPE( p_sym->st_info ) ) {
p_srcfile = SrcFile_DispenseSrcFile( (char *)pb_strtab + p_sym->st_name );
// st_shndx - Section index of symbol.
p_obj->info.symbol.w_secindex = p_sym->st_shndx;
+ if(( SHN_UNDEF == p_sym->st_shndx ) && ( STT_NOTYPE != ELF64_ST_TYPE( p_sym->st_info ) ))
+ { p_obj->b_status |= OBJINFO_STATUS_DYNAMIC; }
+*/
}
if( 0x00 != i_result ) {
#ifdef DRD64_SRC_LIBGOBLIN_ELF_SYMTAB
#endif
-
+LIBGOBLIN_ELF_SYMTAB_EXTERN
+ LibGoblin_ObjectInfo *ELF64_Symtab_RegistSymbol_toObjectInfo(
+ LibGoblin_ProgramInfo *p_pginfo, Elf64_Sym *p_sym, Byte *pb_strtab );
LIBGOBLIN_ELF_SYMTAB_EXTERN
int ELF64_Symtab_ReadSection(
LibGoblin_BinaryInfo *p_binfo );
memset( p_objinfo, 0x00, sizeof( LibGoblin_ObjectInfo ) );
p_objinfo->i_id = i_id;
- p_objinfo->b_status = LIBGOBLIN_OBJINFO_INVALID;
+ p_objinfo->b_status = OBJINFO_STATUS_INVALID;
p_objinfo->grplink.i_parent_id = NO_OBJ;
p_objinfo->grplink.i_child_topid = NO_OBJ;
p_pginfo->objinfo.i_empty = p_objinfo->grplink.i_next_id;
ObjectInfo_ClearObjectInfo( p_objinfo );
- p_objinfo->b_status = LIBGOBLIN_OBJINFO_VALID;
+ p_objinfo->b_status = OBJINFO_STATUS_VALID;
p_pginfo->objinfo.i_used++;
return p_objinfo;
----------------------------------------------------------------------*/
LIBGOBLIN_OBJINFO_EXTERN
LibGoblin_ObjectInfo *
- ObjectInfo_SearchDynamicFunction(
+ ObjectInfo_SearchDynamicSymbol(
LibGoblin_ProgramInfo *p_pginfo,
PtrValue ptr_value,
- QWord qw_size,
- char *pstr_dynsym_name,
- char *pstr_vername )
+ char *pstr_symname )
{
LibGoblin_ObjectInfo *p_objnow;
LibGoblin_ObjectInfo *p_objret = NULL;
- char str_linkname[256];
+ DWord dw_hash;
// Check exist MasterObject ---
if( NO_OBJ == p_pginfo->objinfo.i_topid )
- { goto goto_ObjectInfo_SearchDynamicFunction_post; }
+ { goto goto_ObjectInfo_SearchDynamicSymbol_post; }
// Search ObjectInfo Inset Location. (Address Order)---
p_objnow = OBJINFO( p_pginfo, p_pginfo->objinfo.i_topid );
assert( NULL != p_objnow );
+ dw_hash = Common_CalcDJBhash( pstr_symname );
+
do {
if( p_objnow->addr.ptr_addr.value > ptr_value )
{ break; }
else if( p_objnow->addr.ptr_addr.value == ptr_value ) {
- if(( p_objnow->addr.qw_size == qw_size )
- && ( OBJINFO_TYPE_FUNCTION == p_objnow->b_type )) {
-
- // Check functionname
- strncpy( str_linkname, p_objnow->pstr_name, 255 );
- strncat( str_linkname, "@", 255 );
- strncat( str_linkname, pstr_vername, 255 );
-
- if( !strncmp( str_linkname, pstr_dynsym_name, 256 ) ) {
- p_objret = p_objnow;
- break;
+ if( p_objnow->b_status & OBJINFO_STATUS_DYNAMIC ) {
+ if( dw_hash == p_objnow->dw_hash ) {
+ if( !strncmp( pstr_symname, p_objnow->pstr_name, 256 ) ) {
+ p_objret = p_objnow;
+ break;
+ }
}
}
}
? OBJINFO( p_pginfo, p_objnow->addrlink.i_next_id ) : NULL );
}while( NULL != p_objnow );
- if( NULL != p_objret ) {
- p_objret->pstr_linkname = pstr_dynsym_name;
- p_objret->dw_hash_linkname = Common_CalcDJBhash( pstr_dynsym_name );
- }
-
-goto_ObjectInfo_SearchDynamicFunction_post:
+goto_ObjectInfo_SearchDynamicSymbol_post:
return p_objret;
}
return 0x01;
}
- if( LIBGOBLIN_OBJINFO_INVALID == p_objinfo->b_status ) {
+ if( OBJINFO_STATUS_INVALID == p_objinfo->b_status ) {
return 0x02;
}
LibGoblin_ProgramInfo *p_pginfo, PtrValue ptr_value, QWord qw_size,
LibGoblin_ObjectInfo *p_parent, Byte b_mode );
LIBGOBLIN_OBJINFO_EXTERN
- LibGoblin_ObjectInfo *ObjectInfo_SearchDynamicFunction(
- LibGoblin_ProgramInfo *p_pginfo, PtrValue ptr_value, QWord qw_size,
- char *pstr_dynsym_name, char *pstr_vername );
+ LibGoblin_ObjectInfo *ObjectInfo_SearchDynamicSymbol(
+ LibGoblin_ProgramInfo *p_pginfo, PtrValue ptr_value, char *pstr_symname );
LIBGOBLIN_OBJINFO_EXTERN
int ObjectInfo_FreeObjectInfo( LibGoblin_ProgramInfo *p_pginfo, LibGoblin_ObjectInfo *p_binfo );
LIBGOBLIN_OBJINFO_EXTERN
/*=====================================================================*/
-#define LIBGOBLIN_OBJINFO_INVALID 0x00
-#define LIBGOBLIN_OBJINFO_VALID 0x01
+#define OBJINFO_STATUS_INVALID 0x00
+#define OBJINFO_STATUS_VALID 0x01 // bit 0
+#define OBJINFO_STATUS_DYNAMIC 0x02 // bit 1
#define OBJINFO_TYPE_NULL 0x00
#define OBJINFO_TYPE_MASTER 0x01
// [Symbol ] = st_name - String table index of name.
DWord dw_hash;
- char *pstr_linkname;
- DWord dw_hash_linkname;
-
union {
Byte b_data[128];