首页 > 解决方案 > 如何找到模块名称到不透明指针的 DynaLoader 映射?

问题描述

根据DynaLoader上的文档

dl_unload_file()动态卸载$libref,它必须是一个不透明的“库引用”,从dl_load_file. 成功返回 1,失败返回 0。此功能是可选的,不一定在所有平台上都提供。

所以dl_load_file返回那些不透明的引用。但是,如果我的文件没有通过显式调用来加载dl_unload_file我该如何找出这些引用呢?

标签: perlshared-librarieslibdl

解决方案


您可以使用以下变量找到这些引用,如源代码中所述

@dl_shared_objects  = ();       # shared objects for symbols we have 
@dl_librefs         = ();       # things we have loaded
@dl_modules         = ();       # Modules we have loaded

然而,将它们与库的名称相匹配对用户来说仍然是一个练习,尽管它们似乎对这三个数组的索引敏感。你可以这样做,

my %db;
foreach my $i ( 0 .. $#DynaLoader::dl_librefs ) {
  $db{$DynaLoader::dl_modules[$i]} = {
    dl_shared_objects => $DynaLoader::dl_shared_objects[$i],
    dl_librefs        => $DynaLoader::dl_librefs[$i],
    dl_modules        => $DynaLoader::dl_modules[$i]
  };
}

推荐阅读