diff --git a/README.md b/README.md index e5d14ba..866bcea 100644 --- a/README.md +++ b/README.md @@ -16,3 +16,31 @@ Tool von Donald. ### thomas_libusage Tool von mir. + +### ldd_bee + +Dump all `bee` packages, which contain `.so` libs used by executable. + +#### usage +``` +/project/admin/tools/ldd_bee.pl executable [executable ... ] +``` + +#### output + +``` +# /lib/libXXX.so.N +# /lib/libYYY.so.M +# /usr/lib/libZZZ.so.U +PKGALLPKG[0]=beepkg-1.0.6-3.x86_64 + BEEFILE[0]=/usr/share/bee/beepkg-1.0.6-3.x86_64/beepkg--1.0.6-3.bee + BEETIME[0]=1394791086 # 2 yrs 3 mon (Fri Mar 14 10:58:06 2014) + BEELIB[0]=/usr/lib/libXXX.so.1.0 + +PKGALLPKG[1]=beedep-0.98.5-0.x86_64 + BEEFILE[1]=/usr/share/bee/beedep-0.98.5-0.x86_64/beedep-0.98.5-0.bee + BEETIME[1]=1417173467 # 1 yrs 6 mon (Fri Nov 28 12:17:47 2014) + BEELIB[1]=/usr/lib/libYYY.so.6 + +``` + diff --git a/ldd_bee/ldd_bee.pl b/ldd_bee/ldd_bee.pl new file mode 100755 index 0000000..57d65ca --- /dev/null +++ b/ldd_bee/ldd_bee.pl @@ -0,0 +1,103 @@ +#!/usr/bin/perl -w +use strict; +use Data::Dumper;$Data::Dumper::Sortkeys=1; + +my %ldd; +for (@ARGV) { + @_=`ldd $ARGV[0]`; + chomp @_; + map {/=>\s(\S+)/ && $ldd{$1}++} @_; +} + +my @libs = sort keys %ldd; + +my $k; + +my %BEEQUERY; + +for my $bee () { + next unless -e "$bee/CONTENT"; + $bee=~/.*\/(.*)/; + my $b = $1; + open I,'<',"$bee/CONTENT" or die; + while () { + if (m{:file=(.*)}) { + $_=$1; + s{//.*}{}; #unsymlink + push @{$BEEQUERY{$_}},$b; + } + } +} + +my %bee; +for my $l (@libs) { + print "# $l\n"; + if ( exists( $BEEQUERY{$l}) ) { + map { $bee{$_}{$l}++ } @{$BEEQUERY{$l}}; + } + else { + die "## $l not found in any bee file\n"; + } +} +my $b = 0; +my $lc = 0; +for my $bee ( sort keys %bee ) { + print "\n"; + my ($beefile) = ; + my $mt = (stat($beefile))[9]; + print "PKGALLPKG[$b]=$bee\n"; + print " BEEFILE[$b]=$beefile\n"; + printf " BEETIME[$b]=%d # %s (%s)\n",$mt,years(time-$mt,2),scalar(localtime($mt)); + for my $lib ( sort keys %{$bee{$bee}} ) { + print " BEELIB[$lc]=$lib\n"; + $lc++; + } + $b++; +} + +sub years { + my $s = shift; + my $n = shift; + + if ($s == 0) { + return '0 secs'; + } + my @T=(); + my $t = int($s/(365*60*60*24)); + + push @T, ($t > 0) ? $t : 0; # months + $s -= $t*int(365*60*60*24); + + $t = int($s/(30.42*60*60*24)); + push @T, ($t > 0) ? $t : 0; # months + $s -= $t*int(30.42*60*60*24); + + $t = int($s/(60*60*24)); + push @T, ($t > 0) ? $t : 0; # days + $s -= $t*(60*60*24); + + $t = int($s/(60*60)); + push @T, ($t > 0) ? $t : 0; # hrs + $s -= $t*(60*60); + + $t = int($s/(60)); + push @T, ($t > 0) ? $t : 0; # min + $s -= $t*60; + + $t = int($s); + push @T, ($t > 0) ? $t : 0; # sec + + my @L; + for my $x ('yrs','mon','days','hrs','min','secs') { + my $y = shift @T; + if ($y != 0) { + if (defined($n)) { + $n--; + last if ($n < 0); + } + push @L,"$y $x"; + } + } + return join(' ',@L); +} +