2012-07-24 13:37:48 +00:00
|
|
|
#!/usr/bin/perl
|
|
|
|
|
|
|
|
die "syntax: $0 SYMFILE ELFLIB(S)" unless int(@ARGV) >= 2;
|
|
|
|
|
|
|
|
my $symfile = shift @ARGV;
|
|
|
|
my @elflibs = @ARGV;
|
|
|
|
|
|
|
|
my @wantsyms;
|
|
|
|
my %gotsyms;
|
|
|
|
|
|
|
|
# Skip on non-linux
|
|
|
|
if ($^O ne "linux") {
|
|
|
|
return 77; # Automake's skip code
|
|
|
|
}
|
|
|
|
|
|
|
|
open SYMFILE, $symfile or die "cannot read $symfile: $!";
|
|
|
|
|
|
|
|
while (<SYMFILE>) {
|
|
|
|
next if /{/;
|
|
|
|
next if /}/;
|
|
|
|
next if /global:/;
|
|
|
|
next if /local:/;
|
|
|
|
next if /^\s*$/;
|
|
|
|
next if /^\s*#/;
|
|
|
|
next if /\*/;
|
|
|
|
|
|
|
|
die "malformed line $_" unless /^\s*(\S+);$/;
|
|
|
|
|
|
|
|
push @wantsyms, $1;
|
|
|
|
}
|
|
|
|
close SYMFILE;
|
|
|
|
|
|
|
|
foreach my $elflib (@elflibs) {
|
|
|
|
open NM, "-|", "nm", $elflib or die "cannot run 'nm $elflib': $!";
|
|
|
|
|
|
|
|
while (<NM>) {
|
2012-07-27 12:51:28 +00:00
|
|
|
next unless /^\S+\s(?:T|D)\s(\S+)\s*$/;
|
2012-07-24 13:37:48 +00:00
|
|
|
|
2012-07-27 12:51:28 +00:00
|
|
|
$gotsyms{$1} = 1;
|
2012-07-24 13:37:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
close NM;
|
|
|
|
}
|
|
|
|
|
|
|
|
my $ret = 0;
|
|
|
|
|
|
|
|
foreach my $sym (@wantsyms) {
|
|
|
|
next if exists $gotsyms{$sym};
|
|
|
|
|
|
|
|
print STDERR "Expected symbol $sym is not in ELF library\n";
|
|
|
|
$ret = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
exit($ret);
|