聘我网

新概念招聘3.0

如何打印出一个Perl程序加载的所有动态库?

vote up0vote downstar

很多Perl程序运行时会加载相应的.so动态库,我如何才能方便地打印出一个列表呢?

 

1 个答复

vote up0vote downcheck

要知道Perl是通过DynaLoader这个模块加载动态库的。

vim dump_so:

#! /usr/bin/perl
/*用die重写exit,从而可以被eval捕获*/
BEGIN {
    *CORE::GLOBAL::exit = sub { die "About to exit" } 
}

my $dup = *STDOUT;
$SIG{INT} = sub {
    *STDOUT = $dup;
    print "Dumping so:\n";
    print "$_\n" for @DynaLoader::dl_shared_objects;
    exit;
};

{
    eval{
       open ((local *STDOUT), '>', '/dev/null');
       /*也可以do shift,不同之处是do不会检查文件是否加载过*/
       require shift;
    };
}

print "Dumping so:\n";
print "$_\n" for @DynaLoader::dl_shared_objects;

然后chmod +x dump_so添加执行权限。

用法:

[root@~]# ./dump_so `perldoc -l perl5db.pl`

Loading DB routines from perl5db.pl version 1.28
Editor support available.

Enter h or `h h' for help, or `man perldebug' for more help.

Dumping so:
/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/auto/IO/IO.so

更新

关于require,它只检查之前通过require或者use或者do加载的文件,而不检查入口文件。

链接

您的回答





不是您要找的问题? 浏览其他含有标签 的问题或者 自己问个.