]> err.no Git - dpkg/commitdiff
Let dpkg-shlibdeps be smarter about missing symbols
authorRaphael Hertzog <hertzog@debian.org>
Mon, 24 Sep 2007 15:26:24 +0000 (17:26 +0200)
committerRaphael Hertzog <hertzog@debian.org>
Mon, 24 Sep 2007 15:26:24 +0000 (17:26 +0200)
dpkg-shlibdeps complains about missing symbols only for executables
(as defined by the ELF type) and public libraries (as defined by the
ELF type and the existence of a SONAME). This avoids many warnings
for perl modules and python modules.

scripts/Dpkg/Shlibs/Objdump.pm
scripts/dpkg-shlibdeps.pl
scripts/t/200_Dpkg_Shlibs/objdump.glib-ia64
scripts/t/200_Dpkg_Shlibs/objdump.libc6-2.3
scripts/t/200_Dpkg_Shlibs/objdump.libc6-2.6

index 9d69070288fdafb1c9d46d865f5be17d63dfd25c..e08699df86cdb3ff407ddea87164cb8f4c7dbe8d 100644 (file)
@@ -141,7 +141,7 @@ sub _read {
     $self->{file} = $file;
 
     local $ENV{LC_ALL} = 'C';
-    open(my $objdump, "-|", "objdump", "-w", "-p", "-T", $file)
+    open(my $objdump, "-|", "objdump", "-w", "-f", "-p", "-T", $file)
        || syserr(sprintf(_g("Can't execute objdump: %s"), $!));
     my $ret = $self->_parse($objdump);
     close($objdump);
@@ -190,6 +190,12 @@ sub _parse {
        } elsif ($section eq "none") {
            if (/^\s*\S+:\s*file\s+format\s+(\S+)\s*$/) {
                $self->{format} = $1;
+           } elsif (/^architecture:\s*\S+,\s*flags:\s*\S+\s*$/) {
+               # Parse 2 lines of "-f"
+               # architecture: i386, flags 0x00000112:
+               # EXEC_P, HAS_SYMS, D_PAGED
+               # start address 0x08049b50
+               $self->{flags}{$_} = 1 foreach (split(/,\s*/, <$fh>));
            }
        }
     }
@@ -314,4 +320,15 @@ sub get_needed_libraries {
     return @{$self->{NEEDED}};
 }
 
+sub is_executable {
+    my $self = shift;
+    return exists $self->{flags}{EXEC_P} and $self->{flags}{EXEC_P};
+}
+
+sub is_public_library {
+    my $self = shift;
+    return exists $self->{flags}{DYNAMIC} and $self->{flags}{DYNAMIC}
+       and exists $self->{SONAME} and $self->{SONAME};
+}
+
 1;
index f3117e248c06258057ab9f608e31b2f1c555649e..e1f791b33c2dd37e8387d6fb67256c0676f3c799 100755 (executable)
@@ -177,12 +177,16 @@ foreach my $file (keys %exec) {
        } else {
            my $syminfo = $dumplibs_wo_symfile->locate_symbol($name);
            if (not defined($syminfo)) {
-               my $print_name = $name;
-               # Drop the default suffix for readability
-               $print_name =~ s/\@Base$//;
-               warning(sprintf(
-                   _g("symbol %s used by %s found in none of the libraries."),
-                   $print_name, $file)) unless $sym->{weak};
+               # Complain about missing symbols only for executables
+               # and public libraries
+               if ($obj->is_executable() or $obj->is_public_library()) {
+                   my $print_name = $name;
+                   # Drop the default suffix for readability
+                   $print_name =~ s/\@Base$//;
+                   warning(sprintf(
+                       _g("symbol %s used by %s found in none of the libraries."),
+                       $print_name, $file)) unless $sym->{weak};
+               }
            } else {
                $used_sonames{$syminfo->{soname}}++;
            }
index 1b3d9871188b97668a5f59b08b24aa703d1a40ae..a3ff4d8be6911b7bcac32f0a851d4abbabf4fd10 100644 (file)
@@ -1,5 +1,8 @@
 
 /usr/lib/libglib-2.0.so.0:     file format elf64-little
+architecture: ia64-elf64, flags 0x00000150:
+HAS_SYMS, DYNAMIC, D_PAGED
+start address 0x000000000002dc40
 
 Program Header:
     LOAD off    0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**16
index 2eb8ae34423ab0f6813354e4b66aab89bf42a928..e76105102251bc921fa854517663621439017ece 100644 (file)
@@ -1,5 +1,8 @@
 
 /lib/libc.so.6:     file format elf32-i386
+architecture: i386, flags 0x00000150:
+HAS_SYMS, DYNAMIC, D_PAGED
+start address 0x000161b0
 
 Program Header:
     PHDR off    0x00000034 vaddr 0x00000034 paddr 0x00000034 align 2**2
index 7efee24ac609b68dd759693a90bb742e6fe364a1..ba68d1c9a22fc3738656996fa8318df2ed0bdaea 100644 (file)
@@ -1,5 +1,8 @@
 
 /lib/libc.so.6:     file format elf32-i386
+architecture: i386, flags 0x00000150:
+HAS_SYMS, DYNAMIC, D_PAGED
+start address 0x000161b0
 
 Program Header:
     PHDR off    0x00000034 vaddr 0x00000034 paddr 0x00000034 align 2**2