diff options
Diffstat (limited to 'examples/depmod.pl')
-rwxr-xr-x | examples/depmod.pl | 65 |
1 files changed, 56 insertions, 9 deletions
diff --git a/examples/depmod.pl b/examples/depmod.pl index c356d27..6b47bad 100755 --- a/examples/depmod.pl +++ b/examples/depmod.pl @@ -13,7 +13,7 @@ # This program is free software; you can redistribute it and/or modify it # under the same terms as Perl itself. -use Getopt::Long; +use Getopt::Long qw(:config no_auto_abbrev no_ignore_case); use File::Find; use strict; @@ -23,6 +23,9 @@ my $basedir=""; my $kernel=""; my $kernelsyms=""; my $symprefix=""; +my $all=0; +my $quick=0; +my $errsyms=0; my $stdout=0; my $verbose=0; my $help=0; @@ -44,6 +47,8 @@ $0 -b basedir { -k <vmlinux> | -F <System.map> } [options]... -n --stdout : Write to stdout instead of <basedir>/modules.dep -v --verbose : Print out lots of debugging stuff -P --symbol-prefix : Symbol prefix + -a --all : Probe all modules (default/only thing supported) + -e --errsyms : Report any symbols not supplied by modules/kernel TXT # get command-line options @@ -55,14 +60,23 @@ GetOptions( "stdout|n" => \$stdout, "verbose|v" => \$verbose, "symbol-prefix|P=s" => \$symprefix, + "all|a" => \$all, + # unsupported options + "quick|A" => \$quick, + # ignored options (for historical usage) + "quiet|q", + "root|r", + "unresolved-error|u" ); die $usage if $help; die $usage unless $basedir && ( $kernel || $kernelsyms ); die "can't use both -k and -F\n\n$usage" if $kernel && $kernelsyms; +die "sorry, -A/--quick is not supported" if $quick; +die "--errsyms requires --kernelsyms" if $errsyms && !$kernelsyms; # Strip any trailing or multiple slashes from basedir -$basedir =~ s-(/)\1+-/-g; +$basedir =~ s-/+$--g; # The base directory should contain /lib/modules somewhere if($basedir !~ m-/lib/modules-) { @@ -137,6 +151,35 @@ foreach my $module (keys %$dep) { } } +# build a complete dependency list for each module and make sure it +# is kept in order proper order +my $mod2 = {}; +sub maybe_unshift +{ + my ($array, $ele) = @_; + # chop off the leading path /lib/modules/<kver>/ as modprobe + # will handle relative paths just fine + $ele =~ s:^/lib/modules/[^/]*/::; + foreach (@{$array}) { + if ($_ eq $ele) { + return; + } + } + unshift (@{$array}, $ele); +} +foreach my $module (keys %$mod) { + warn "filling out module: $module\n" if $verbose; + @{$mod2->{$module}} = (); + foreach my $md (keys %{$mod->{$module}}) { + foreach my $md2 (keys %{$mod->{$md}}) { + warn "outputting $md2\n" if $verbose; + maybe_unshift (\@{$mod2->{$module}}, $md2); + } + warn "outputting $md\n" if $verbose; + maybe_unshift (\@{$mod2->{$module}}, $md); + } +} + # figure out where the output should go if ($stdout == 0) { open(STDOUT, ">$basedir/modules.dep") @@ -151,8 +194,11 @@ foreach my $module ( keys %$mod ) { print join(" \\\n\t",@sorted); print "\n\n"; } else { - print "$module: "; - my @sorted = sort bydep keys %{$mod->{$module}}; + my $shortmod = $module; + $shortmod =~ s:^/lib/modules/[^/]*/::; + print "$shortmod:"; + my @sorted = @{$mod2->{$module}}; + printf " " if @sorted; print join(" ",@sorted); print "\n"; } @@ -163,15 +209,16 @@ sub build_ref_tables { my ($name, $sym_ar, $exp, $dep) = @_; - my $ksymtab = grep m/ __ksymtab/, @$sym_ar; + my $ksymtab = grep m/ ${symprefix}__ksymtab/, @$sym_ar; # gather the exported symbols if($ksymtab){ # explicitly exported foreach ( @$sym_ar ) { - / __ksymtab_(.*)$/ and do { - warn "sym = $1\n" if $verbose; - $exp->{$1} = $name; + / ${symprefix}__ksymtab_(.*)$/ and do { + my $sym = ${symprefix} . $1; + warn "sym = $sym\n" if $verbose; + $exp->{$sym} = $name; }; } } else { @@ -189,7 +236,7 @@ sub build_ref_tables # gather the unresolved symbols foreach ( @$sym_ar ) { - !/ __this_module/ && / U (.*)$/ and do { + !/ ${symprefix}__this_module/ && / U (.*)$/ and do { warn "und = $1\n" if $verbose; push @{$dep->{$name}}, $1; }; |