X-Git-Url: https://git.jankratochvil.net/?p=massrebuild.git;a=blobdiff_plain;f=dtneededsize;h=61ea9b8294c5b69b70ce7a64bfee5558f5375461;hp=9cbb467cb30e99d123fb024e38559519ccf901de;hb=3a0826600210f718dbd773934e84eb6dd09c6a59;hpb=6c8610b08891ff7db5afd5fb8e8d0e462424840d diff --git a/dtneededsize b/dtneededsize index 9cbb467..61ea9b8 100755 --- a/dtneededsize +++ b/dtneededsize @@ -4,6 +4,8 @@ use warnings; use File::Basename qw(&dirname); use File::Find; use Data::Dumper; +use Statistics::Basic::StdDev; +use List::Util; $|=1; sub readfile { @@ -16,19 +18,71 @@ sub readfile { return $r; } +my %D; +# ==> build/Cadence-1.0.0-0.12.20200504git5787908.fc33.src.rpm.dtneeded <== +# /usr/lib/debug/.dwz/Cadence isdwzcommon 479079 NA +# /usr/bin/cadence-jackmeter /usr/lib/debug/.dwz/Cadence 717792 1329040 +# /usr/bin/cadence-xycontroller /usr/lib/debug/.dwz/Cadence 1763616 2369832 +# ==> build/CVector-1.0.3.1-21.fc33.src.rpm.dtneeded <== +# /usr/lib64/libCVector-1.0.3.so.2.0.0 nodwzcommon 28088 28896 +for my $dtneededfn (glob "build/*.dtneeded") { + local *F; + open F,$dtneededfn or die "$dtneededfn: $1"; + local $_; + while () { + chomp; + my($fn,$dwzcommon,$dwzsize,$dtsize)=/^(\S+) (\S+) (\S+) (\S+)$/ or die "$dtneededfn: $_"; + die if $dwzcommon eq "isdwzcommon" && $dtsize ne "NA"; + my $ref=\$D{$fn}; + if ($$ref) { + die if $dwzcommon eq "isdwzcommon"; + $$ref=[]; + } else { + $$ref=[$dwzcommon,$dwzsize,$dtsize]; + } + } + close F or die "close $dtneededfn: $1"; +} + chdir "dtneeded.out" or die "dtneeded.out: $!"; my %F; my %SONAME; my @DEBUG; +my %SYMLINK; find { "no_chdir"=>1, "wanted"=>sub { die $File::Find::dir if $File::Find::dir=~m{/$}; my $binfn=$File::Find::name; + if (-l $binfn) { + my $target=readlink $binfn or die $binfn; + $binfn=~s{^[.]}{}; + my $final; + if ($target=~m{^/}) { + $final=$target; +#warn "$binfn,target=rel=$$ref\n"; + } else { + my $base=dirname(".$binfn"); + my $abs=File::Spec->rel2abs($target,$base); + $final="/".File::Spec->abs2rel($abs); +#warn "$binfn,base=$base,target=$target,abs=$abs,rel=$$ref\n"; + } + 1 while $final=~s{/[^/]+/[.][.]/}{/}; + 1 while $final=~s{/[^/]+/[.][.]$}{}; + if ($final=~m{/[.][.]}) { + warn "$binfn,target=$target,final=$final\n"; + return; + } + my $ref=\$SYMLINK{$binfn}; + die if $$ref; + $$ref=$final; + return; + } return if !-f $binfn; die $binfn if $binfn!~m{^[.]/}; my $bin=readfile $binfn; + $binfn=~s{^[.]}{} or die; my $rpath=($bin=~m{^.*\Q(R\E(?:UN)?\QPATH)\E\s*Library r(?:un)?path: \Q[\E(.*)\Q]\E$}m)[0]; if ($rpath) { my $dirname=$File::Find::dir; @@ -42,18 +96,32 @@ find { }; $h->{"rpath"}=$rpath if $rpath; $F{$binfn}=$h; +#warn "$binfn=".Dumper($h)."\n" if $binfn=~/libc.so.6/; # my $total=keys %F; warn "$total...\n" if 0==$total%1000; if ($soname) { - my $ref=\$SONAME{$File::Find::dir."/".$soname}; -# warn "soname=<$soname> <$binfn> vs. <".$$ref->{"binfn"}.">\n" if $$ref; + my $sonamefn=$File::Find::dir."/".$soname; + $sonamefn=~s{^[.]/}{/} or die $sonamefn; + my $ref=\$SONAME{$sonamefn}; +# warn "soname=<$sonamefn> <$binfn> vs. <".$$ref->{"binfn"}.">\n" if $$ref; $$ref=$h; } push @DEBUG,$binfn if $bin=~m{ \Q(DEBUG) \E }; }, },"."; -for my $binfn (@DEBUG) { +#while (my($src,$target)=each %SYMLINK) { +# die "$src->$target" if exists $SYMLINK{$target}; +#} + +my $dwzsizeall=0; +my $dwzsizeduplall=0; +my $dtsizeall=0; +my @ratioall; +my @ratioduplall; +my $computed=0; +BINFN: for my $binfn (@DEBUG) { # warn "$binfn...\n".Dumper([sort @{$F{$binfn}{"needed"}}]); + die $binfn if exists $SYMLINK{$binfn}; my @l=$binfn; my %l=($binfn=>1); while (@l) { @@ -62,6 +130,7 @@ for my $binfn (@DEBUG) { for my $needed (@{$h->{"needed"}}) { my $found; if ($needed=~m{^/}) { + $needed=$SYMLINK{$needed} while exists $SYMLINK{$needed}; $found=$needed; } else { # die "$binfn: $l: $needed" if $needed=~m{/}; @@ -74,7 +143,8 @@ for my $binfn (@DEBUG) { warn "$binfn: $l: $rpath"; next; } - my $fn=".$rpath/$needed"; + my $fn="$rpath/$needed"; + $fn=$SYMLINK{$fn} while exists $SYMLINK{$fn}; next if !$SONAME{$fn}; $found=$fn; last; @@ -84,5 +154,51 @@ for my $binfn (@DEBUG) { push @l,$found if $found&&!$l{$found}++; } } +#warn Dumper $binfn,\%l; + my $dwzsizetot=0; + my $dwzsizedupltot=0; + my $dtsizetot=0; + my %dwzcommons; + for my $l (keys(%l)) { + my $ref=$D{$l}; + if (!defined $ref) { + warn "$binfn: $l: missing\n"; + next BINFN; + } + if (0==@$ref) { + warn "$binfn: $l: ambiguous\n"; + next BINFN; + } + my $dtsize=$ref->[2]; + die if !defined $dtsize; + $dtsizetot+=$dtsize; + my $dwzsize=$ref->[1]; + die if !defined $dwzsize; + $dwzsizetot+=$dwzsize; + $dwzsizedupltot+=$dwzsize; + $computed++; + my $dwzcommon=$ref->[0]; + next if $dwzcommon eq "nodwzcommon"; + die if $dwzcommon eq "isdwzcommon"; + my $duplicate=$dwzcommons{$dwzcommon}++; + my $dwzcommonref=$D{$dwzcommon}; + die if !$dwzcommonref; + die if $dwzcommonref->[0] ne "isdwzcommon"; + die if $dwzcommonref->[2] ne "NA"; + my $dwzcommonsize=$dwzcommonref->[1]; + $dwzsizetot+=$dwzcommonsize if !$duplicate; + $dwzsizedupltot+=$dwzcommonsize; + } + print "$binfn: dwzsizetot=$dwzsizetot dtsizetot=$dtsizetot\n"; +warn "$binfn: ".Dumper(\%dwzcommons); + $dwzsizeall+=$dwzsizetot; + $dwzsizeduplall+=$dwzsizedupltot; + $dtsizeall+=$dtsizetot; + push @ratioall ,$dwzsizetot /$dtsizetot; + push @ratioduplall,$dwzsizedupltot/$dtsizetot; # warn "$binfn done\n".Dumper([sort keys(%l)]); } +print "dwzsizeall =$dwzsizeall" ." dtsizeall=$dtsizeall =".$dwzsizeall /$dtsizeall." avg=".List::Util::sum(@ratioall )/@ratioall ." stddev=".Statistics::Basic::stddev(\@ratioall )."\n"; +print "dwzsizeduplall=$dwzsizeduplall"." dtsizeall=$dtsizeall =".$dwzsizeduplall/$dtsizeall." avg=".List::Util::sum(@ratioduplall)/@ratioduplall." stddev=".Statistics::Basic::stddev(\@ratioduplall)."\n"; +print "computed=$computed of DEBUG=".(0+@DEBUG)." =".$computed/@DEBUG."\n"; +#print Dumper \@ratioall;