From: Raphael Hertzog Date: Sun, 16 Mar 2008 22:27:59 +0000 (+0100) Subject: dpkg-shlibdeps: accounts usage of symbols of libraries without SONAME X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cee53c8f75be1fea506f4db22d4033b61bf911af;p=dpkg dpkg-shlibdeps: accounts usage of symbols of libraries without SONAME * scripts/Dpkg/Shlibs/Objdump.pm: Add "objid" property to symbols and fake "soname" property with the basename of the object's filename if the object has no official SONAME. * scripts/dpkg-shlibdeps.pl: Add some more debugging messages. * scripts/dpkg-shlibdeps.pl: Also count usage of alternate sonames for symbols found in symbols files. --- diff --git a/ChangeLog b/ChangeLog index 66103e28..fd422302 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2008-03-16 Raphael Hertzog + + * scripts/Dpkg/Shlibs/Objdump.pm: Add "objid" property to + symbols and fake "soname" property with the basename of the + object's filename if the object has no official SONAME. + * scripts/dpkg-shlibdeps.pl: Add some more debugging messages. + * scripts/dpkg-shlibdeps.pl: Also count usage of alternate sonames + for symbols found in symbols files. + 2008-03-16 Guillem Jover * configure.ac (AC_CHECK_HEADERS): Add 'libintl.h'. diff --git a/debian/changelog b/debian/changelog index 442d2a89..ae76f84e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -67,6 +67,8 @@ dpkg (1.14.17) UNRELEASED; urgency=low must be discarded due to another dependency appearing further in the field, the superseding dependency will take the place of the discarded one. Added a test case for this. + * dpkg-shlibdeps properly accounts usage of symbols provided by private + libraries without SONAME. Closes: #469838 [ Frank Lichtenheld ] * Add a warning in dpkg-buildpackage if the build-dependencies are not diff --git a/scripts/Dpkg/Shlibs/Objdump.pm b/scripts/Dpkg/Shlibs/Objdump.pm index 35a05ac4..9bb98027 100644 --- a/scripts/Dpkg/Shlibs/Objdump.pm +++ b/scripts/Dpkg/Shlibs/Objdump.pm @@ -315,7 +315,8 @@ sub apply_relocations { sub add_dynamic_symbol { my ($self, $symbol) = @_; - $symbol->{soname} = $self->{SONAME}; + $symbol->{objid} = $symbol->{soname} = $self->get_id(); + $symbol->{soname} =~ s{^.*/}{} unless $self->{SONAME}; if ($symbol->{version}) { $self->{dynsyms}{$symbol->{name} . '@' . $symbol->{version}} = $symbol; } else { diff --git a/scripts/dpkg-shlibdeps.pl b/scripts/dpkg-shlibdeps.pl index 92655f94..8cb9890f 100755 --- a/scripts/dpkg-shlibdeps.pl +++ b/scripts/dpkg-shlibdeps.pl @@ -85,7 +85,7 @@ foreach (@ARGV) { } elsif (m/^-t(.*)$/) { $packagetype = $1; } elsif (m/^-v$/) { - $debug = 1; + $debug++; } elsif (m/^-x(.*)$/) { push @exclude, $1; } elsif (m/^-/) { @@ -116,7 +116,7 @@ my %shlibs; my $cur_field; foreach my $file (keys %exec) { $cur_field = $exec{$file}; - print "Scanning $file (for $cur_field field)\n" if $debug; + print ">> Scanning $file (for $cur_field field)\n" if $debug; my $obj = Dpkg::Shlibs::Objdump::Object->new($file); my @sonames = $obj->get_needed_libraries; @@ -195,7 +195,7 @@ foreach my $file (keys %exec) { } else { # No symbol file found, fall back to standard shlibs my $id = $dumplibs_wo_symfile->parse($lib); - if ($id ne $soname) { + if (($id ne $soname) and ($id ne $lib)) { warning(_g("%s has an unexpected SONAME (%s)"), $lib, $id); $alt_soname{$id} = $soname; } @@ -241,14 +241,21 @@ foreach my $file (keys %exec) { } else { $name .= "\@Base"; } + print " Looking up symbol $name\n" if $debug > 1; my $symdep = $symfile->lookup_symbol($name, \@sonames); if (defined($symdep)) { + print " Found in symbols file of $symdep->{soname}\n" if $debug > 1; $used_sonames{$symdep->{soname}}++; + if (exists $alt_soname{$symdep->{soname}}) { + # Also count usage on alternate soname + $used_sonames{$alt_soname{$symdep->{soname}}}++; + } update_dependency_version($symdep->{depends}, $symdep->{minver}); } else { my $syminfo = $dumplibs_wo_symfile->locate_symbol($name); if (not defined($syminfo)) { + print " Not found\n" if $debug > 1; next if $disable_warnings; # Complain about missing symbols only for executables # and public libraries @@ -267,6 +274,7 @@ foreach my $file (keys %exec) { } } } else { + print " Found in $syminfo->{soname} ($syminfo->{objid})\n" if $debug > 1; if (exists $alt_soname{$syminfo->{soname}}) { # Also count usage on alternate soname $used_sonames{$alt_soname{$syminfo->{soname}}}++;