]> err.no Git - dpkg/commitdiff
dpkg-shlibdeps: accounts usage of symbols of libraries without SONAME
authorRaphael Hertzog <hertzog@debian.org>
Sun, 16 Mar 2008 22:27:59 +0000 (23:27 +0100)
committerRaphael Hertzog <hertzog@debian.org>
Sun, 16 Mar 2008 22:31:14 +0000 (23:31 +0100)
* 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.

ChangeLog
debian/changelog
scripts/Dpkg/Shlibs/Objdump.pm
scripts/dpkg-shlibdeps.pl

index 66103e2833e45ad46f8183475eb8adeda238daa5..fd4223021ab91d4cbab7a045d5e5e92894aad49c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-03-16  Raphael Hertzog  <hertzog@debian.org>
+
+       * 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  <guillem@debian.org>
 
        * configure.ac (AC_CHECK_HEADERS): Add 'libintl.h'.
index 442d2a89e52c88f74a1b24da4ba12ef791f07b5f..ae76f84e96c22292a5f99775efe016a765960648 100644 (file)
@@ -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
index 35a05ac4a0407a4a3a26b62fbfc40969d35b450f..9bb9802778b3bbe54ff89438d28268145e6a584a 100644 (file)
@@ -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 {
index 92655f94fcd9aa09a8bc347ab854f4b683227de7..8cb9890f5c5264c1826f3ee32664874889ea2c6c 100755 (executable)
@@ -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}}}++;