如何找出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
。
-
然而,它确实有一个在模块的包命名为
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;