4 use File::Basename qw(&dirname);
12 open F,"$fname" or die $fname;
14 defined(my $r=<F>) or die $fname;
15 close F or die $fname;
19 chdir "dtneeded.out" or die "dtneeded.out: $!";
27 die $File::Find::dir if $File::Find::dir=~m{/$};
28 my $binfn=$File::Find::name;
30 die $binfn if $binfn!~m{^[.]/};
31 my $bin=readfile $binfn;
32 my $rpath=($bin=~m{^.*\Q(R\E(?:UN)?\QPATH)\E\s*Library r(?:un)?path: \Q[\E(.*)\Q]\E$}m)[0];
34 my $dirname=$File::Find::dir;
35 die if $dirname!~s{^[.]/}{/};
36 $rpath=~s{\$ORIGIN}{$dirname}g;
38 my $soname=($bin=~m{^.*\Q(SONAME)\E\s*Library soname: \Q[\E(.*)\Q]\E$}m)[0];
41 "needed"=>[$bin=~m{^\s*0x0000000000000001\s*\Q(NEEDED)\E\s*\QShared library: [\E(.*)\Q]\E$}gm],
43 $h->{"rpath"}=$rpath if $rpath;
45 # my $total=keys %F; warn "$total...\n" if 0==$total%1000;
47 my $ref=\$SONAME{$File::Find::dir."/".$soname};
48 # warn "soname=<$soname> <$binfn> vs. <".$$ref->{"binfn"}.">\n" if $$ref;
51 push @DEBUG,$binfn if $bin=~m{ \Q(DEBUG) \E };
55 for my $binfn (@DEBUG) {
56 # warn "$binfn...\n".Dumper([sort @{$F{$binfn}{"needed"}}]);
62 for my $needed (@{$h->{"needed"}}) {
67 # die "$binfn: $l: $needed" if $needed=~m{/};
69 my $rpath=$h->{"rpath"};
70 push @rpath,split /:/,$rpath if $rpath;
71 push @rpath,qw(/lib64 /usr/lib64);
72 for my $rpath (@rpath) {
74 warn "$binfn: $l: $rpath";
77 my $fn=".$rpath/$needed";
78 next if !$SONAME{$fn};
82 warn "$binfn: $l: $needed not found; rpath=".join(":",@rpath)."\n" if !$found;
84 push @l,$found if $found&&!$l{$found}++;
87 # warn "$binfn done\n".Dumper([sort keys(%l)]);