}
# Scan all symbols in the file and mark as deprecated those that are
- # no more provided
+ # no more provided (only if the minver is bigger than the version where
+ # the symbol was introduced)
foreach my $sym (keys %{$self->{objects}{$soname}{syms}}) {
if (! exists $dynsyms{$sym}) {
- $self->{objects}{$soname}{syms}{$sym}{deprecated} = $minver;
+ my $info = $self->{objects}{$soname}{syms}{$sym};
+ if (vercmp($minver, $info->{minver}) > 0) {
+ $self->{objects}{$soname}{syms}{$sym}{deprecated} = $minver;
+ }
}
}
}
}
sub lookup_symbol {
- my ($self, $name, $sonames) = @_;
+ my ($self, $name, $sonames, $inc_deprecated) = @_;
+ $inc_deprecated = 0 unless defined($inc_deprecated);
foreach my $so (@{$sonames}) {
next if (! exists $self->{objects}{$so});
if (exists $self->{objects}{$so}{syms}{$name} and
- not $self->{objects}{$so}{syms}{$name}{deprecated})
+ ($inc_deprecated or not
+ $self->{objects}{$so}{syms}{$name}{deprecated}))
{
my $dep_id = $self->{objects}{$so}{syms}{$name}{dep_id};
return {
# -*- mode: cperl;-*-
-use Test::More tests => 25;
+use Test::More tests => 26;
use strict;
use warnings;
is( $sym_file_old->lookup_symbol('__bss_start@Base', ['libc.so.6']),
undef, 'internal symbols are blacklisted');
+$sym = $sym_file->lookup_symbol('_errno@GLIBC_2.0', ['libc.so.6'], 1);
+is_deeply($sym, { 'minver' => '2.3.6.ds1-13', 'dep_id' => 0,
+ 'deprecated' => '2.6-1', 'depends' => '',
+ 'soname' => 'libc.so.6' }, 'deprecated symbol');
use File::Temp;