From 5e7f14cfb3bace1ebf3ef57b25e28a8111a12f12 Mon Sep 17 00:00:00 2001 From: "Koine Yuusuke(koinec)" Date: Mon, 23 Nov 2015 21:08:16 +0900 Subject: [PATCH] *WorkBackup: 2015/11/23(Mon) 21:06 --- libgoblin/drd64_libgoblin_addrinfo.c | 52 ++++++++++++++++++++++++++++-- libgoblin/drd64_libgoblin_debug_addrinfo.c | 9 ++---- 2 files changed, 52 insertions(+), 9 deletions(-) diff --git a/libgoblin/drd64_libgoblin_addrinfo.c b/libgoblin/drd64_libgoblin_addrinfo.c index cb7d130..fbc37e8 100644 --- a/libgoblin/drd64_libgoblin_addrinfo.c +++ b/libgoblin/drd64_libgoblin_addrinfo.c @@ -67,18 +67,36 @@ int p_sym64 = (Elf64_Sym *)p_syminfo->pb_symbol; p_addr->ptr_address = p_syminfo->ptr_address; - p_addr->pstr_name = (char *)(pb_strtab + p_sym64->st_name); p_addr->dw_size = (DWord)p_sym64->st_size; // p_addr->dw_srcid is update when reading DWARF data. // p_addr->dw_next is update when finalizing ELF/DWARF reading phase. p_addr->b_elf_flags = p_sym64->st_info; p_addr->w_secid = LibGoblin_Section_GetSectionID_fromSectionNumber_inElf( p_binfo, p_secinfo->i_fid, p_sym64->st_shndx ); + if( STT_SECTION == (p_addr->b_elf_flags & 0x0f) ) + { p_addr->pstr_name = LibGoblin_Section_GetSectionName( p_binfo, p_addr->w_secid ); } + else + { p_addr->pstr_name = (char *)(pb_strtab + p_sym64->st_name); } } else if( isElf32( p_binfo ) ) { p_sym32 = (Elf32_Sym *)p_syminfo->pb_symbol; + p_addr->ptr_address = p_syminfo->ptr_address; + p_addr->dw_size = (DWord)p_sym32->st_size; + // p_addr->dw_srcid is update when reading DWARF data. + // p_addr->dw_next is update when finalizing ELF/DWARF reading phase. + p_addr->b_elf_flags = p_sym32->st_info; + p_addr->w_secid = LibGoblin_Section_GetSectionID_fromSectionNumber_inElf( + p_binfo, p_secinfo->i_fid, p_sym32->st_shndx ); + if( STT_SECTION == (p_addr->b_elf_flags & 0x0f) ) + { p_addr->pstr_name = LibGoblin_Section_GetSectionName( p_binfo, p_addr->w_secid ); } + else + { p_addr->pstr_name = (char *)(pb_strtab + p_sym32->st_name); } } + else { return -0x02; } + + p_syminfo->dw_type = LIBGOBLIN_SYMWORKINFO_TYPE_ADDRTBL; + p_syminfo->pb_symbol = (Byte *)p_addr; return 0x00; } @@ -86,6 +104,35 @@ int /*---------------------------------------------------------------------- ----------------------------------------------------------------------*/ +int + LibGoblin_AddrInfo_Move_AddrInfo( + LibGoblin_BinaryInfo *p_binfo, + LibGoblin_AddressInfo *p_addr, + LibGoblin_SymbolWorkInfo *p_syminfo ) +{ + LibGoblin_AddressInfo *p_srcaddr; + + assert( NULL != p_binfo ); + assert( NULL != p_addr ); + assert( NULL != p_syminfo ); + + p_srcaddr = (LibGoblin_AddressInfo *)p_syminfo->pb_symbol; + assert( NULL != p_srcaddr ); + + if( p_addr == p_srcaddr ) { return 0x00; } + + memcpy( p_addr, p_srcaddr, sizeof( LibGoblin_AddressInfo ) ); + + p_syminfo->pb_symbol = (Byte *)p_addr; + + memset( p_srcaddr, 0x00, sizeof( LibGoblin_AddressInfo ) ); + + return 0x00; +} + + +/*---------------------------------------------------------------------- +----------------------------------------------------------------------*/ LIBGOBLIN_ADDRINFO_EXTERN int LibGoblin_AddrInfo_SyncSymbolWorkTable( @@ -131,9 +178,8 @@ int } else if( LIBGOBLIN_SYMWORKINFO_TYPE_ADDRTBL == p_syminfo->dw_type ) { - + i_result = LibGoblin_AddrInfo_Move_AddrInfo( p_binfo, p_addr, p_syminfo ); } - } p_binfo->dw_max_addrinfo = p_symworktbl->dw_max_symwork; diff --git a/libgoblin/drd64_libgoblin_debug_addrinfo.c b/libgoblin/drd64_libgoblin_debug_addrinfo.c index cfbdfac..1a054e7 100644 --- a/libgoblin/drd64_libgoblin_debug_addrinfo.c +++ b/libgoblin/drd64_libgoblin_debug_addrinfo.c @@ -48,7 +48,6 @@ int { Word w_scope; Word w_type; - Word w_secid; DWord dw_cnt; LibGoblin_AddressInfo *p_addr; @@ -89,12 +88,10 @@ int } // pstr_name + printf( "%30s ", p_addr->pstr_name ); if( STT_SECTION == w_type ) { - printf("%30s ", - LibGoblin_Section_GetSectionName( p_binfo, p_addr->w_secid )); - } - else { - printf( "%30s ", p_addr->pstr_name ); + printf("\n"); + continue; } // dw_srcid -- 2.11.0