13 |
|
|
14 |
# This program is free software; you can redistribute it and/or modify it |
# This program is free software; you can redistribute it and/or modify it |
15 |
# under the same terms as Perl itself. |
# under the same terms as Perl itself. |
16 |
use Getopt::Long; |
use Getopt::Long qw(:config no_auto_abbrev no_ignore_case); |
17 |
use File::Find; |
use File::Find; |
18 |
use strict; |
use strict; |
19 |
|
|
23 |
my $kernel=""; |
my $kernel=""; |
24 |
my $kernelsyms=""; |
my $kernelsyms=""; |
25 |
my $symprefix=""; |
my $symprefix=""; |
26 |
|
my $all=0; |
27 |
|
my $quick=0; |
28 |
|
my $errsyms=0; |
29 |
my $stdout=0; |
my $stdout=0; |
30 |
my $verbose=0; |
my $verbose=0; |
31 |
my $help=0; |
my $help=0; |
47 |
-n --stdout : Write to stdout instead of <basedir>/modules.dep |
-n --stdout : Write to stdout instead of <basedir>/modules.dep |
48 |
-v --verbose : Print out lots of debugging stuff |
-v --verbose : Print out lots of debugging stuff |
49 |
-P --symbol-prefix : Symbol prefix |
-P --symbol-prefix : Symbol prefix |
50 |
|
-a --all : Probe all modules (default/only thing supported) |
51 |
|
-e --errsyms : Report any symbols not supplied by modules/kernel |
52 |
TXT |
TXT |
53 |
|
|
54 |
# get command-line options |
# get command-line options |
60 |
"stdout|n" => \$stdout, |
"stdout|n" => \$stdout, |
61 |
"verbose|v" => \$verbose, |
"verbose|v" => \$verbose, |
62 |
"symbol-prefix|P=s" => \$symprefix, |
"symbol-prefix|P=s" => \$symprefix, |
63 |
|
"all|a" => \$all, |
64 |
|
# unsupported options |
65 |
|
"quick|A" => \$quick, |
66 |
|
# ignored options (for historical usage) |
67 |
|
"quiet|q", |
68 |
|
"root|r", |
69 |
|
"unresolved-error|u" |
70 |
); |
); |
71 |
|
|
72 |
die $usage if $help; |
die $usage if $help; |
73 |
die $usage unless $basedir && ( $kernel || $kernelsyms ); |
die $usage unless $basedir && ( $kernel || $kernelsyms ); |
74 |
die "can't use both -k and -F\n\n$usage" if $kernel && $kernelsyms; |
die "can't use both -k and -F\n\n$usage" if $kernel && $kernelsyms; |
75 |
|
die "sorry, -A/--quick is not supported" if $quick; |
76 |
|
die "--errsyms requires --kernelsyms" if $errsyms && !$kernelsyms; |
77 |
|
|
78 |
# Strip any trailing or multiple slashes from basedir |
# Strip any trailing or multiple slashes from basedir |
79 |
$basedir =~ s-(/)\1+-/-g; |
$basedir =~ s-/+$--g; |
80 |
|
|
81 |
# The base directory should contain /lib/modules somewhere |
# The base directory should contain /lib/modules somewhere |
82 |
if($basedir !~ m-/lib/modules-) { |
if($basedir !~ m-/lib/modules-) { |
151 |
} |
} |
152 |
} |
} |
153 |
|
|
154 |
|
# build a complete dependency list for each module and make sure it |
155 |
|
# is kept in order proper order |
156 |
|
my $mod2 = {}; |
157 |
|
sub maybe_unshift |
158 |
|
{ |
159 |
|
my ($array, $ele) = @_; |
160 |
|
# chop off the leading path /lib/modules/<kver>/ as modprobe |
161 |
|
# will handle relative paths just fine |
162 |
|
$ele =~ s:^/lib/modules/[^/]*/::; |
163 |
|
foreach (@{$array}) { |
164 |
|
if ($_ eq $ele) { |
165 |
|
return; |
166 |
|
} |
167 |
|
} |
168 |
|
unshift (@{$array}, $ele); |
169 |
|
} |
170 |
|
sub add_mod_deps |
171 |
|
{ |
172 |
|
my ($depth, $mod, $mod2, $module, $this_module) = @_; |
173 |
|
|
174 |
|
$depth .= " "; |
175 |
|
warn "${depth}loading deps of module: $this_module\n" if $verbose; |
176 |
|
|
177 |
|
foreach my $md (keys %{$mod->{$this_module}}) { |
178 |
|
add_mod_deps ($depth, $mod, $mod2, $module, $md); |
179 |
|
warn "${depth} outputting $md\n" if $verbose; |
180 |
|
maybe_unshift (\@{$$mod2->{$module}}, $md); |
181 |
|
} |
182 |
|
|
183 |
|
if (!%{$mod->{$this_module}}) { |
184 |
|
warn "${depth} no deps\n" if $verbose; |
185 |
|
} |
186 |
|
} |
187 |
|
foreach my $module (keys %$mod) { |
188 |
|
warn "filling out module: $module\n" if $verbose; |
189 |
|
@{$mod2->{$module}} = (); |
190 |
|
add_mod_deps ("", $mod, \$mod2, $module, $module); |
191 |
|
} |
192 |
|
|
193 |
# figure out where the output should go |
# figure out where the output should go |
194 |
if ($stdout == 0) { |
if ($stdout == 0) { |
195 |
|
warn "writing $basedir/modules.dep\n" if $verbose; |
196 |
open(STDOUT, ">$basedir/modules.dep") |
open(STDOUT, ">$basedir/modules.dep") |
197 |
or die "cannot open $basedir/modules.dep: $!"; |
or die "cannot open $basedir/modules.dep: $!"; |
198 |
} |
} |
205 |
print join(" \\\n\t",@sorted); |
print join(" \\\n\t",@sorted); |
206 |
print "\n\n"; |
print "\n\n"; |
207 |
} else { |
} else { |
208 |
print "$module: "; |
my $shortmod = $module; |
209 |
my @sorted = sort bydep keys %{$mod->{$module}}; |
$shortmod =~ s:^/lib/modules/[^/]*/::; |
210 |
|
print "$shortmod:"; |
211 |
|
my @sorted = @{$mod2->{$module}}; |
212 |
|
printf " " if @sorted; |
213 |
print join(" ",@sorted); |
print join(" ",@sorted); |
214 |
print "\n"; |
print "\n"; |
215 |
} |
} |
220 |
{ |
{ |
221 |
my ($name, $sym_ar, $exp, $dep) = @_; |
my ($name, $sym_ar, $exp, $dep) = @_; |
222 |
|
|
223 |
my $ksymtab = grep m/ __ksymtab/, @$sym_ar; |
my $ksymtab = grep m/ ${symprefix}__ksymtab/, @$sym_ar; |
224 |
|
|
225 |
# gather the exported symbols |
# gather the exported symbols |
226 |
if($ksymtab){ |
if($ksymtab){ |
227 |
# explicitly exported |
# explicitly exported |
228 |
foreach ( @$sym_ar ) { |
foreach ( @$sym_ar ) { |
229 |
/ __ksymtab_(.*)$/ and do { |
/ ${symprefix}__ksymtab_(.*)$/ and do { |
230 |
warn "sym = $1\n" if $verbose; |
my $sym = ${symprefix} . $1; |
231 |
$exp->{$1} = $name; |
warn "sym = $sym\n" if $verbose; |
232 |
|
$exp->{$sym} = $name; |
233 |
}; |
}; |
234 |
} |
} |
235 |
} else { |
} else { |
247 |
|
|
248 |
# gather the unresolved symbols |
# gather the unresolved symbols |
249 |
foreach ( @$sym_ar ) { |
foreach ( @$sym_ar ) { |
250 |
!/ __this_module/ && / U (.*)$/ and do { |
!/ ${symprefix}__this_module/ && / U (.*)$/ and do { |
251 |
warn "und = $1\n" if $verbose; |
warn "und = $1\n" if $verbose; |
252 |
push @{$dep->{$name}}, $1; |
push @{$dep->{$name}}, $1; |
253 |
}; |
}; |