LIBGOBLIN_API
int LibGoblin_AnalyzeMainProgram( int i_pgid );
LIBGOBLIN_API
+ int LibGoblin_AnalyzeLibrary( int i_pgid, int i_bid, PtrValue ptr_loadaddr );
+LIBGOBLIN_API
int LibGoblin_GetUnresolv_ObjectFilePath( int i_pgid, LibGoblin_ObjectFilePath *p_objpath );
LIBGOBLIN_API
int LibGoblin_SetPathAndLoad_ObjectFilePath( LibGoblin_ObjectFilePath *p_objpath );
***********************************************************************/
LIBGOBLIN_API
int
+ LibGoblin_AnalyzeLibrary(
+ int i_pgid,
+ int i_bid,
+ PtrValue ptr_loadaddr )
+{
+ int i_result;
+ LibGoblin_BinaryInfo *p_binfo;
+
+ p_binfo = BinaryInfo_GetBinInfo( i_bid );
+ if( NULL == p_binfo ) {
+ return -0x01;
+ }
+
+ if( p_binfo->i_pginfo != i_pgid ) {
+ return -0x02;
+ }
+
+ i_result = ELF_ReadELF_Phase2( p_binfo, ptr_loadaddr );
+ if( 0x00 != i_result ) {
+ return -0x03;
+ }
+
+ return i_result;
+}
+
+
+/***********************************************************************
+***********************************************************************/
+LIBGOBLIN_API
+int
LibGoblin_GetUnresolv_ObjectFilePath(
int i_pgid,
LibGoblin_ObjectFilePath *p_objpath )
if( 0x00000000 < ptr_addr ) {
ptr_addr += p_binfo->ptr_loadbase;
- p_obj = ObjectInfo_SearchDynamicSymbol( p_pginfo, ptr_addr, pstr_symname );
+ p_obj = ObjectInfo_SearchDynamicSymbol(
+ p_pginfo, ptr_addr, pstr_symname, OBJINFO_STATUS_DYNAMIC );
// If the target program is stripped, p_obj = NULL because don't exist .symtab section.
if( NULL == p_obj ) {
p_obj = ELF64_Symtab_RegistSymbol_toObjectInfo(
ObjectInfo_SearchDynamicSymbol(
LibGoblin_ProgramInfo *p_pginfo,
PtrValue ptr_value,
- char *pstr_symname )
+ char *pstr_symname,
+ DWord dw_status )
{
LibGoblin_ObjectInfo *p_objnow;
LibGoblin_ObjectInfo *p_objret = NULL;
if( p_objnow->addr.ptr_addr.value > ptr_value )
{ break; }
else if( p_objnow->addr.ptr_addr.value == ptr_value ) {
- if( p_objnow->dw_status & OBJINFO_STATUS_DYNAMIC ) {
- if( dw_hash == p_objnow->dw_hash ) {
+ if( dw_hash == p_objnow->dw_hash ) {
+ if(( 0x00 == dw_status ) || ( p_objnow->dw_status & dw_status )) {
if( !strncmp( pstr_symname, p_objnow->pstr_name, 256 ) ) {
p_objret = p_objnow;
break;
LibGoblin_ProgramInfo *p_pginfo, PtrValue ptr_value, QWord qw_size );
LIBGOBLIN_OBJINFO_EXTERN
LibGoblin_ObjectInfo *ObjectInfo_SearchDynamicSymbol(
- LibGoblin_ProgramInfo *p_pginfo, PtrValue ptr_value, char *pstr_symname );
+ LibGoblin_ProgramInfo *p_pginfo, PtrValue ptr_value, char *pstr_symname, DWord dw_status );
LIBGOBLIN_OBJINFO_EXTERN
int ObjectInfo_FreeObjectInfo( LibGoblin_ProgramInfo *p_pginfo, LibGoblin_ObjectInfo *p_binfo );
LIBGOBLIN_OBJINFO_EXTERN
i_result = LibGoblin_AnalyzeMainProgram( i_pgid );
CU_ASSERT( 0x00 == i_result );
+ //i_result = LibGoblin_AnalyzeLibrary( i_pgid, i_bid[2], 0x80000000 );
+ //CU_ASSERT( 0x00 == i_result );
+
i_result = LibGoblin_FreeProgInfo( i_pgid );
CU_ASSERT( 0x00 == i_result );