]> err.no Git - dpkg/commitdiff
Don't consider local symbols when merging symbols in SymbolFile
authorRaphael Hertzog <hertzog@debian.org>
Tue, 14 Aug 2007 13:09:58 +0000 (15:09 +0200)
committerRaphael Hertzog <hertzog@debian.org>
Tue, 14 Aug 2007 13:09:58 +0000 (15:09 +0200)
Local symbols can only be used by the object defining them so they
can't be used by applications linked against the library. Hence they
are not needed in the "symbols" files that we used to track dependencies
on shared libraries. Use the get_exported_dynamic_symbols function to
ensure that we use the right set of symbols.

scripts/Dpkg/Shlibs/Objdump.pm
scripts/Dpkg/Shlibs/SymbolFile.pm

index 19a38f4799a994167cb7c2d1c6fe93a8b27bc439..307e63b578216a2b4b8a5652e8b73fafa387803f 100644 (file)
@@ -296,7 +296,7 @@ sub get_symbol {
 
 sub get_exported_dynamic_symbols {
     my ($self) = @_;
-    return grep { $_->{defined} && $_->{dynamic} }
+    return grep { $_->{defined} && $_->{dynamic} && !$_->{local} }
            values %{$self->{dynsyms}};
 }
 
index 329f763ac5f7c1939e081309ed18bf0b70dc6863..f1d0bedeea709b8052afc0f07dc77fc34ff4bd57 100644 (file)
@@ -182,12 +182,15 @@ sub dump {
 sub merge_symbols {
     my ($self, $object, $minver) = @_;
     my $soname = $object->{SONAME} || error(_g("Can't merge symbols from objects without SONAME."));
-    my %dynsyms = map { $_ => $object->{dynsyms}{$_} }
-       grep { 
-           local $a = $object->{dynsyms}{$_}; 
-           $a->{dynamic} && $a->{defined} && not exists $blacklist{$a->{name}}
+    my %dynsyms;
+    foreach my $sym ($object->get_exported_dynamic_symbols()) {
+       next if exists $blacklist{$sym->{name}};
+       if ($sym->{version}) {
+           $dynsyms{$sym->{name} . '@' . $sym->{version}} = $sym;
+       } else {
+           $dynsyms{$sym->{name}} = $sym;
        }
-       keys %{$object->{dynsyms}};
+    }
 
     unless ($self->{objects}{$soname}) {
        $self->create_object($soname, '');