aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dlfcn.c59
1 files changed, 6 insertions, 53 deletions
diff --git a/src/dlfcn.c b/src/dlfcn.c
index b52b307..2b2ea07 100644
--- a/src/dlfcn.c
+++ b/src/dlfcn.c
@@ -512,39 +512,6 @@ static BOOL get_image_section( HMODULE module, int index, void **ptr, DWORD *siz
512 return TRUE; 512 return TRUE;
513} 513}
514 514
515/* Return symbol name for a given address from import table */
516static const char *get_import_symbol_name( HMODULE module, IMAGE_IMPORT_DESCRIPTOR *iid, void *addr, void **func_address )
517{
518 int i;
519 void *candidateAddr = NULL;
520 const char *candidateName = NULL;
521 BYTE *base = (BYTE *) module; /* Required to have correct calculations */
522
523 for( i = 0; iid[i].Characteristics != 0 && iid[i].FirstThunk != 0; i++ )
524 {
525 IMAGE_THUNK_DATA *thunkILT = (IMAGE_THUNK_DATA *)( base + iid[i].Characteristics );
526 IMAGE_THUNK_DATA *thunkIAT = (IMAGE_THUNK_DATA *)( base + iid[i].FirstThunk );
527
528 for( ; thunkILT->u1.AddressOfData != 0; thunkILT++, thunkIAT++ )
529 {
530 IMAGE_IMPORT_BY_NAME *nameData;
531
532 if( IMAGE_SNAP_BY_ORDINAL( thunkILT->u1.Ordinal ) )
533 continue;
534
535 if( (void *) thunkIAT->u1.Function > addr || candidateAddr >= (void *) thunkIAT->u1.Function )
536 continue;
537
538 candidateAddr = (void *) thunkIAT->u1.Function;
539 nameData = (IMAGE_IMPORT_BY_NAME *)( base + (ULONG_PTR) thunkILT->u1.AddressOfData );
540 candidateName = (const char *) nameData->Name;
541 }
542 }
543
544 *func_address = candidateAddr;
545 return candidateName;
546}
547
548/* Return symbol name for a given address from export table */ 515/* Return symbol name for a given address from export table */
549static const char *get_export_symbol_name( HMODULE module, IMAGE_EXPORT_DIRECTORY *ied, void *addr, void **func_address ) 516static const char *get_export_symbol_name( HMODULE module, IMAGE_EXPORT_DIRECTORY *ied, void *addr, void **func_address )
550{ 517{
@@ -642,13 +609,11 @@ static void *get_address_from_import_address_table( void *iat, DWORD iat_size, v
642/* Holds module filename */ 609/* Holds module filename */
643static char module_filename[2*MAX_PATH]; 610static char module_filename[2*MAX_PATH];
644 611
645static BOOL fill_info( HMODULE hModuleImport, void *addr, Dl_info *info ) 612static BOOL fill_info( void *addr, Dl_info *info )
646{ 613{
647 HMODULE hModule; 614 HMODULE hModule;
648 DWORD dwSize; 615 DWORD dwSize;
649 IMAGE_EXPORT_DIRECTORY *ied; 616 IMAGE_EXPORT_DIRECTORY *ied;
650 IMAGE_IMPORT_DESCRIPTOR *iid;
651 const char *name;
652 void *funcAddress = NULL; 617 void *funcAddress = NULL;
653 618
654 /* Get module of the specified address */ 619 /* Get module of the specified address */
@@ -662,23 +627,12 @@ static BOOL fill_info( HMODULE hModuleImport, void *addr, Dl_info *info )
662 627
663 info->dli_fname = module_filename; 628 info->dli_fname = module_filename;
664 info->dli_fbase = (void *) hModule; 629 info->dli_fbase = (void *) hModule;
665 info->dli_sname = NULL;
666 630
667 /* First try to find function name and function address in module's export table */ 631 /* Find function name and function address in module's export table */
668 if( get_image_section( hModule, IMAGE_DIRECTORY_ENTRY_EXPORT, (void **) &ied, NULL ) ) 632 if( get_image_section( hModule, IMAGE_DIRECTORY_ENTRY_EXPORT, (void **) &ied, NULL ) )
669 info->dli_sname = get_export_symbol_name( hModule, ied, addr, &funcAddress ); 633 info->dli_sname = get_export_symbol_name( hModule, ied, addr, &funcAddress );
670 634 else
671 /* If symbol name is not known and we know which module is importing this address 635 info->dli_sname = NULL;
672 * then try to find symbol name in this module's import table as the last resort. */
673 if( info->dli_sname == NULL && hModuleImport != NULL )
674 {
675 if( get_image_section( hModuleImport, IMAGE_DIRECTORY_ENTRY_IMPORT, (void **) &iid, NULL ) )
676 {
677 name = get_import_symbol_name( hModuleImport, iid, addr, &funcAddress );
678 if( name != NULL )
679 info->dli_sname = name;
680 }
681 }
682 636
683 info->dli_saddr = info->dli_sname == NULL ? NULL : funcAddress != NULL ? funcAddress : addr; 637 info->dli_saddr = info->dli_sname == NULL ? NULL : funcAddress != NULL ? funcAddress : addr;
684 638
@@ -688,8 +642,6 @@ static BOOL fill_info( HMODULE hModuleImport, void *addr, Dl_info *info )
688DLFCN_EXPORT 642DLFCN_EXPORT
689int dladdr( void *addr, Dl_info *info ) 643int dladdr( void *addr, Dl_info *info )
690{ 644{
691 HMODULE hModule = NULL;
692
693 if( addr == NULL || info == NULL ) 645 if( addr == NULL || info == NULL )
694 return 0; 646 return 0;
695 647
@@ -700,6 +652,7 @@ int dladdr( void *addr, Dl_info *info )
700 { 652 {
701 void *iat; 653 void *iat;
702 DWORD iatSize; 654 DWORD iatSize;
655 HMODULE hModule;
703 656
704 /* Get module of the import thunk address */ 657 /* Get module of the import thunk address */
705 if( !GetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, addr, &hModule ) || hModule == NULL ) 658 if( !GetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, addr, &hModule ) || hModule == NULL )
@@ -732,7 +685,7 @@ int dladdr( void *addr, Dl_info *info )
732 return 0; 685 return 0;
733 } 686 }
734 687
735 if( !fill_info( hModule, addr, info ) ) 688 if( !fill_info( addr, info ) )
736 return 0; 689 return 0;
737 690
738 return 1; 691 return 1;