要知道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加载的文件,而不检查入口文件。