#!/usr/bin/perl -w # SPDX-License-Identifier: GPL-2.0 # # kabisyms - a script tools to generate kabi baseline and check symbol # referance relationship. # # Author: Xie XiuQi # Copyright (C) 2019 Huawei, Inc. # # This software may be freely redistributed under the terms of the GNU # General Public License (GPL). # # usage: # ./scripts/kabisyms -k -s -o # ./scripts/kabisyms -k -d -o use 5.010; use strict; use Getopt::Long; use File::Basename; my $SYMLIST; my $SYMVERS; my $KABIDEPS; my $OUTPUT = "Module.kabi"; my $VERBOSE; my $PROG = basename $0; sub usage { say "usage:"; say " $PROG [--symlist|k] [--symvers|s] [--kabideps|d] [--output|o] [--verbose|v] [--help|h|?]"; say " -k|--symlist"; say " symbol list (filename)"; say " -s|--symvers"; say " Module.symvers"; say " -d|--kabideps"; say " kabideps"; say " -o|--output"; say " filename of output"; say " -v|--verbose:"; say " show more info"; say " -h|-?|--help:"; say " show this usage"; say " examples:"; say " ./scripts/kabisyms -k -s -o "; say " ./scripts/kabisyms -k -d -o "; exit 0; } usage() unless (@ARGV); my $result = GetOptions( 'symlist|k=s' => \$SYMLIST, 'symvers|s=s' => \$SYMVERS, 'kabideps|d=s' => \$KABIDEPS, 'output|o=s' => \$OUTPUT, 'verbose|v!' => \$VERBOSE, 'help|h|?' => \&usage, ) or usage(); my @syms; my @symvers; my @kabideps; if ($SYMLIST) { @syms = `cat $SYMLIST`; chomp @syms; } else { usage(); } if ($SYMVERS) { @symvers = `cat $SYMVERS`; chomp @symvers; } elsif ($KABIDEPS) { @kabideps = `cat $KABIDEPS`; chomp @kabideps; } else { usage(); } sub check_sym { my $sym = shift; my @res; my $found; foreach (@symvers) { if (/^\s*$/) { next; } if (/^0x[0-9a-fA-F]+\s+$sym\s+/) { printf OUT "%s\n", $_; $found = 1; last; } } printf "%s is not included in %s\n", $sym, $SYMVERS if (!$found); } sub check_deps { my $sym = shift; my @res; my $found; foreach (@kabideps) { if (/^\s*$/) { next; } if (/^\s*$sym:/) { printf OUT "%s\n", $_; $found = 1; last; } } printf "%s is not included in %s\n", $sym, $KABIDEPS if (!$found); } my $output = $OUTPUT; open(OUT, ">", "$output") || die "can't open >$output : $!"; my $total = @syms; my $count; for (@syms) { if ($SYMVERS) { check_sym($_); } elsif ($KABIDEPS) { check_deps($_); } printf "\r%d/%d", ++$count, $total if ($VERBOSE); } printf "output to %s\n", $OUTPUT; close OUT;