427 Star 1.5K Fork 1.6K

GVPopenEuler/kernel

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
kabideps 3.14 KB
一键复制 编辑 原始数据 按行查看 历史
#!/usr/bin/perl -w
# SPDX-License-Identifier: GPL-2.0
#
# kabideps - a script tools to generate symbol referenced by other modules
#
# We use this script to check against reference Module.kabi files.
#
# Author: Xie XiuQi <xiexiuqi@huawei.com>
# Copyright (C) 2019 Huawei, Inc.
#
# This software may be freely redistributed under the terms of the GNU
# General Public License (GPL).
#
# usage:
# ./scripts/kabideps -m <module list> -s <symvers> -d <basedir of modules> -e
use 5.010;
use strict;
use Getopt::Long;
use File::Basename;
my $MODULES;
my $SYMVERS;
my $EXCLUDE;
my $BASEDIR;
my $VERBOSE;
my $PROG = basename $0;
sub usage {
say "usage:";
say " $PROG [--modules|m] [--symvers|s] [--basedir|d] [--exclude|e] [--verbose|v] [--help|h|?]";
say " -m|--module";
say " module list to be check (filename)";
say " -d|--basedir";
say " dir of ko";
say " -s|--symvers";
say " Module.symvers";
say " -e|--exclude";
say " exclude symbols which exported by the modules themselves";
say " -v|--verbose:";
say " show more info";
say " -h|-?|--help:";
say " show this usage";
exit 0;
}
usage() unless (@ARGV);
my $result = GetOptions(
'module|m=s' => \$MODULES,
'basedir|d=s' => \$BASEDIR,
'symvers|s=s' => \$SYMVERS,
'exclude|e!' => \$EXCLUDE,
'verbose|v!' => \$VERBOSE,
'help|h|?' => \&usage,
) or usage();
my @mods;
if ($MODULES) {
@mods = `cat $MODULES`; chomp @mods;
}
else {
@mods = `find $BASEDIR |grep -E ".ko\$"`; chomp @mods;
}
my @allsyms = exclude_check();
my $allmodsyms = {};
sub check_sym {
my $sym = shift;
my @res;
foreach my $m (@mods) {
my @kmodsyms;
my $modname = basename $m;
if ($m =~ /^\s*$/) {
next;
}
if (!$allmodsyms->{$m}) {
@kmodsyms = `modprobe --dump-modversions $m |awk '{print \$2}'`; chomp @kmodsyms;
$allmodsyms->{$m} = \@kmodsyms;
}
my $syms = $allmodsyms->{$m};
for (@{$syms}) {
if ($sym eq $_) {
push @res, $modname;
}
}
}
my $num = @res;
printf OUT "%d: ", $num;
for (@res) {
printf OUT "%s ", $_;
}
}
sub exclude_check {
my @syms;
my @res;
my $i;
if ($EXCLUDE) {
@syms = `cat $SYMVERS`; chomp @syms;
}
else {
@res = `cat $SYMVERS |awk '{print $2}'`; chomp @syms;
return @res;
}
my $total = @syms;
my $count;
say "excluding symbols exported by modules themselves...";
for ($i = 0; $i < @syms; $i++) {
my @words = split(/\s+/, $syms[$i]);
my $found = 0;
foreach my $mod (@mods) {
my $m;
$words[2] = basename $words[2];
$m = basename $mod;
$m =~ s/\.ko$//g;
if ($words[2] eq $m) {
$found = 1;
last;
}
}
push @res, $words[1] unless($found);
printf "\r%d/%d", $count++, $total;
}
print "\n";
return @res;
}
my $output = "kabideps.txt";
open(OUT, ">", "$output")
|| die "can't open >$output : $!";
my $total = @allsyms;
my $count;
say "checking symbols ...";
for (@allsyms) {
printf OUT "%s: ", $_;
check_sym($_);
print OUT "\n";
printf "\r%d/%d", $count++, $total;
}
close OUT;
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C
1
https://gitee.com/openeuler/kernel.git
git@gitee.com:openeuler/kernel.git
openeuler
kernel
kernel
openEuler-22.03-LTS-SP1

搜索帮助