如何找出DynaLoader“库引用”引用的内容?

问题描述:

Perl通过@DynaLoader::dl_librefs的文件句柄保留外部动态加载库的数据库如何找出DynaLoader保留句柄的库?如何找出DynaLoader“库引用”引用的内容?

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

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

我该怎么办?

DynaLoader::bootstrap不保存它加载的文件的名称($file)。 [1]

手柄本身是系统相关的手柄。例如,在Windows上,它们是由LoadLibraryExA(动态链接)或GetModuleHandle(静态链接)返回的HMODULE值。在该系统上,您可以使用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;