diff options
author | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2006-12-02 19:34:17 +0000 |
---|---|---|
committer | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2006-12-02 19:34:17 +0000 |
commit | f2e4ecf1d8de0c98895de005a332b2af16e7964b (patch) | |
tree | a2d5b76b25bcc6150bc5d0ab650e1199c8480b95 /target/device/x86/depmod.pl | |
parent | fc19465fd7bee1348393c4313e7e173a6dc9163c (diff) |
- add generic target. X86 for now, don't fork this but generalize it!
Diffstat (limited to 'target/device/x86/depmod.pl')
-rw-r--r-- | target/device/x86/depmod.pl | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/target/device/x86/depmod.pl b/target/device/x86/depmod.pl new file mode 100644 index 000000000..5e8d5f38e --- /dev/null +++ b/target/device/x86/depmod.pl @@ -0,0 +1,237 @@ +#!/usr/bin/perl -w +# vi: set ts=4: +# Copyright (c) 2001 David Schleef <ds@schleef.org> +# Copyright (c) 2001 Erik Andersen <andersen@codepoet.org> +# Copyright (c) 2001 Stuart Hughes <stuarth@lineo.com> +# Copyright (c) 2002 Steven J. Hill <shill@broadcom.com> +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +# TODO -- use strict mode... +#use strict; + +use Getopt::Long; +use File::Find; + + +# Set up some default values + +my $basedir=""; +my $kernel; +my $kernelsyms; +my $stdout=0; +my $verbose=0; + + +# get command-line options + +my %opt; + +GetOptions( + \%opt, + "help|h", + "basedir|b=s" => \$basedir, + "kernel|k=s" => \$kernel, + "kernelsyms|F=s" => \$kernelsyms, + "stdout|n" => \$stdout, + "verbose|v" => \$verbose, +); + +if (defined $opt{help}) { + print + " $0 [OPTION]... [basedir]\n", + " -h --help\t\tShow this help screen\n", + " -b --basedir\tModules base directory (defaults to /lib/modules)\n", + " -k --kernel\tKernel binary for the target\n", + " -F --kernelsyms\tKernel symbol file\n", + " -n --stdout\tWrite to stdout instead of <basedir>/modules.dep\n", + " -v --verbose\tPrint out lots of debugging stuff\n", + ; + exit 1; +} + +if($basedir !~ m-/lib/modules-) { + warn "WARNING: base directory does not match ..../lib/modules\n"; +} + +# Find the list of .o files living under $basedir +#if ($verbose) { printf "Locating all modules\n"; } +my($ofile) = ""; +my($file) = ""; +my(@liblist) = (); +find sub { + if ( -f $_ && ! -d $_ ) { + $file = $File::Find::name; + if ( $file =~ /.o$/ ) { + push(@liblist, $file); + if ($verbose) { printf "$file\n"; } + } + } +}, $basedir; +if ($verbose) { printf "Finished locating modules\n"; } + +foreach $obj ( @liblist, $kernel ){ + # turn the input file name into a target tag name + # vmlinux is a special that is only used to resolve symbols + if($obj =~ /vmlinux/) { + $tgtname = "vmlinux"; + } else { + ($tgtname) = $obj =~ m-(/lib/modules/.*)$-; + } + + warn "MODULE = $tgtname\n" if $verbose; + + # get a list of symbols + @output=`nm $obj`; + $ksymtab=grep m/ __ksymtab/, @output; + + # gather the exported symbols + if($ksymtab){ + # explicitly exported + foreach ( @output ) { + / __ksymtab_(.*)$/ and do { + warn "sym = $1\n" if $verbose; + $exp->{$1} = $tgtname; + }; + } + } else { + # exporting all symbols + foreach ( @output) { + / [ABCDGRST] (.*)$/ and do { + warn "syma = $1\n" if $verbose; + $exp->{$1} = $tgtname; + }; + } + } + # gather the unresolved symbols + foreach ( @output ) { + !/ __this_module/ && / U (.*)$/ and do { + warn "und = $1\n" if $verbose; + push @{$dep->{$tgtname}}, $1; + }; + } +} + + +# reduce dependancies: remove unresolvable and resolved from vmlinux +# remove duplicates +foreach $module (keys %$dep) { + $mod->{$module} = {}; + foreach (@{$dep->{$module}}) { + if( $exp->{$_} ) { + warn "resolved symbol $_ in file $exp->{$_}\n" if $verbose; + next if $exp->{$_} =~ /vmlinux/; + $mod->{$module}{$exp->{$_}} = 1; + } else { + warn "unresolved symbol $_ in file $module\n"; + } + } +} + +# resolve the dependancies for each module +if ($stdout == 1) { + foreach $module ( keys %$mod ) { + print "$module:\t"; + @sorted = sort bydep keys %{$mod->{$module}}; + print join(" \\\n\t",@sorted); + print "\n\n"; + } +} else { + open(OFILE, ">$basedir/modules.dep"); + foreach $module ( keys %$mod ) { + print OFILE "$module:\t"; + @sorted = sort bydep keys %{$mod->{$module}}; + print OFILE join(" \\\n\t",@sorted); + print OFILE "\n\n"; + } +} + + +sub bydep +{ + foreach my $f ( keys %{$mod->{$b}} ) { + if($f eq $a) { + return 1; + } + } + return -1; +} + + + +__END__ + +=head1 NAME + +depmod.pl - a cross platform script to generate kernel module dependency + lists which can then be used by modprobe. + +=head1 SYNOPSIS + +depmod.pl [OPTION]... [basedir]... + +Example: + + depmod.pl -F linux/System.map target/lib/modules + +=head1 DESCRIPTION + +The purpose of this script is to automagically generate a list of of kernel +module dependancies. This script produces dependancy lists that should be +identical to the depmod program from the modutils package. Unlike the depmod +binary, however, depmod.pl is designed to be run on your host system, not +on your target system. + +This script was written by David Schleef <ds@schleef.org> to be used in +conjunction with the BusyBox modprobe applet. + +=head1 OPTIONS + +=over 4 + +=item B<-h --help> + +This displays the help message. + +=item B<-b --basedir> + +The base directory uner which the target's modules will be found. This +defaults to the /lib/modules directory. + +=item B<-k --kernel> + +Kernel binary for the target. You must either supply a kernel binary +or a kernel symbol file (using the -F option). + +=item B<-F --kernelsyms> + +Kernel symbol file for the target. You must supply either a kernel symbol file +kernel binary for the target (using the -k option). + +=item B<-n --stdout> + +Write to stdout instead of modules.dep. This is currently hard coded... +kernel binary for the target (using the -k option). + +=item B<--verbose> + +Be verbose (not implemented) + +=back + +=head1 COPYRIGHT + +Copyright (c) 2001 David Schleef <ds@schleef.org> +Copyright (c) 2001 Erik Andersen <andersen@codepoet.org> +Copyright (c) 2001 Stuart Hughes <stuarth@lineo.com> +This program is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 AUTHOR + +David Schleef <ds@schleef.org> + +=cut + +# $Id: depmod.pl,v 1.1 2004/12/08 01:34:41 andersen Exp $ + |