2017-10-20 1 views
1

Perl은 파일 핸들별로 외부 동적으로로드 된 라이브러리 데이터베이스를 유지합니다 @DynaLoader::dl_librefsDynaLoader 핸들을 유지하는 라이브러리는 무엇입니까?DynaLoader "라이브러리 참조"가 참조하는 것이 무엇인지 어떻게 알 수 있습니까?

sub f { 
    my $h = shift; 
    # something that gives me a name, or caller or something useful? 
    return $name; 
}; 

map f($_), @DynaLoader::dl_librefs; 

어떻게해야합니까?

답변

1

DynaLoader::bootstrap은로드하는 파일의 이름을 저장하지 않습니다 ($file). [1]

핸들 자체는 시스템 종속 핸들입니다. 예를 들어, Windows에서는 HMODULE 값이 LoadLibraryExA (동적으로 링크 됨) 또는 GetModuleHandle (정적으로 링크 됨)에 의해 반환됩니다. 해당 시스템에서는 GetModuleFileName을 사용할 수 있습니다.


  1. 그러나, 모듈의 패키지에 bootstrap라는 이름의 서브와 경로를 연결한다. 다음 스 니펫을 사용하여 특정 DynaLoader 사용 모듈의 라이브러리 경로를 찾을 수 있습니다.

    use B qw(svref_2object); 
    
    my $module_name = 'Foo::Bar'; 
    
    my $glob = do { no strict qw(refs); *{$module_name.'::bootstrap'} }; 
    my $code = *$glob{CODE} 
        or die("Module $module_name not loaded or doesn't use DynaLoader\n"); 
    
    my $path = svref_2object($code)->FILE; 
    
관련 문제