diff options
Diffstat (limited to 'osinfo/check-symfile.pl')
-rwxr-xr-x | osinfo/check-symfile.pl | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/osinfo/check-symfile.pl b/osinfo/check-symfile.pl new file mode 100755 index 0000000..d59a213 --- /dev/null +++ b/osinfo/check-symfile.pl @@ -0,0 +1,70 @@ +#!/usr/bin/perl + +# Copyright (C) 2012-2013 Red Hat, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see +# <http://www.gnu.org/licenses/>. + +die "syntax: $0 SYMFILE ELFLIB(S)" unless int(@ARGV) >= 2; + +my $symfile = shift @ARGV; +my @elflibs = @ARGV; + +my %wantsyms; +my %gotsyms; + +my $ret = 0; + +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+);$/; + + if (exists $wantsyms{$1}) { + print STDERR "Symbol $1 is listed twice\n"; + $ret = 1; + } else { + $wantsyms{$1} = 1; + } +} +close SYMFILE; + +foreach my $elflib (@elflibs) { + open NM, "-|", "nm", $elflib or die "cannot run 'nm $elflib': $!"; + + while (<NM>) { + next unless /^\S+\s(?:[TBD])\s(\S+)\s*$/; + + $gotsyms{$1} = 1; + } + + close NM; +} + +foreach my $sym (keys(%wantsyms)) { + next if exists $gotsyms{$sym}; + + print STDERR "Expected symbol $sym is not in ELF library\n"; + $ret = 1; +} + +exit($ret); |