238 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			238 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
#!/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@lineo.com>
 | 
						|
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.3 2003/07/14 21:20:51 andersen Exp $
 | 
						|
 |