source: MondoRescue/branches/stable/mindi-busybox/examples/depmod.pl @ 821

Last change on this file since 821 was 821, checked in by Bruno Cornec, 14 years ago

Addition of busybox 1.2.1 as a mindi-busybox new package
This should avoid delivering binary files in mindi not built there (Fedora and Debian are quite serious about that)

  • Property svn:executable set to *
File size: 7.6 KB
Line 
1#!/usr/bin/perl -w
2# vi: set ts=4:
3# Copyright (c) 2001 David Schleef <ds@schleef.org>
4# Copyright (c) 2001 Erik Andersen <andersen@codepoet.org>
5# Copyright (c) 2001 Stuart Hughes <seh@zee2.com>
6# Copyright (c) 2002 Steven J. Hill <shill@broadcom.com>
7# Copyright (c) 2006 Freescale Semiconductor, Inc <stuarth@freescale.com>
8#
9# History:
10# March 2006: Stuart Hughes <stuarth@freescale.com>.
11#             Significant updates, including implementing the '-F' option
12#             and adding support for 2.6 kernels.
13
14# This program is free software; you can redistribute it and/or modify it
15# under the same terms as Perl itself.
16use Getopt::Long;
17use File::Find;
18use strict;
19
20# Set up some default values
21my $kdir="";
22my $basedir="";
23my $kernel="";
24my $kernelsyms="";
25my $stdout=0;
26my $verbose=0;
27my $help=0;
28my $nm = $ENV{'NM'} || "nm";
29
30# more globals
31my (@liblist) = ();
32my $exp = {};
33my $dep = {};
34my $mod = {};
35
36my $usage = <<TXT;
37$0 -b basedir { -k <vmlinux> | -F <System.map> } [options]...
38  Where:
39   -h --help         : Show this help screen
40   -b --basedir      : Modules base directory (e.g /lib/modules/<2.x.y>)
41   -k --kernel       : Kernel binary for the target (e.g. vmlinux)
42   -F --kernelsyms   : Kernel symbol file (e.g. System.map)
43   -n --stdout       : Write to stdout instead of <basedir>/modules.dep
44   -v --verbose      : Print out lots of debugging stuff
45TXT
46
47# get command-line options
48GetOptions(
49    "help|h"         => \$help,
50    "basedir|b=s"    => \$basedir,
51    "kernel|k=s"     => \$kernel,
52    "kernelsyms|F=s" => \$kernelsyms,
53    "stdout|n"       => \$stdout,
54    "verbose|v"      => \$verbose,
55);
56
57die $usage if $help;
58die $usage unless $basedir && ( $kernel || $kernelsyms );
59die "can't use both -k and -F\n\n$usage" if $kernel && $kernelsyms;
60
61# Strip any trailing or multiple slashes from basedir
62$basedir =~ s-(/)\1+-/-g;
63
64# The base directory should contain /lib/modules somewhere
65if($basedir !~ m-/lib/modules-) {
66    warn "WARNING: base directory does not match ..../lib/modules\n";
67}
68
69# if no kernel version is contained in the basedir, try to find one
70if($basedir !~ m-/lib/modules/\d\.\d-) {
71    opendir(BD, $basedir) or die "can't open basedir $basedir : $!\n";
72    foreach ( readdir(BD) ) {
73        next if /^\.\.?$/;
74        next unless -d "$basedir/$_";
75        warn "dir = $_\n" if $verbose;
76        if( /^\d\.\d/ ) {
77            $kdir = $_;
78            warn("Guessed module directory as $basedir/$kdir\n");
79            last;
80        }
81    }
82    closedir(BD);
83    die "Cannot find a kernel version under $basedir\n" unless $kdir;
84    $basedir = "$basedir/$kdir";
85}
86
87# Find the list of .o or .ko files living under $basedir
88warn "**** Locating all modules\n" if $verbose;
89find sub {
90    my $file;
91    if ( -f $_  && ! -d $_ ) {
92        $file = $File::Find::name;
93        if ( $file =~ /\.k?o$/ ) {
94            push(@liblist, $file);
95            warn "$file\n" if $verbose;
96        }
97    }
98}, $basedir;
99warn "**** Finished locating modules\n" if $verbose;
100
101foreach my $obj ( @liblist ){
102    # turn the input file name into a target tag name
103    my ($tgtname) = $obj =~ m-(/lib/modules/.*)$-;
104
105    warn "\nMODULE = $tgtname\n" if $verbose;
106
107    # get a list of symbols
108    my @output=`$nm $obj`;
109
110    build_ref_tables($tgtname, \@output, $exp, $dep);
111}
112
113
114# vmlinux is a special name that is only used to resolve symbols
115my $tgtname = 'vmlinux';
116my @output = $kernelsyms ? `cat $kernelsyms` : `$nm $kernel`;
117warn "\nMODULE = $tgtname\n" if $verbose;
118build_ref_tables($tgtname, \@output, $exp, $dep);
119
120# resolve the dependencies for each module
121# reduce dependencies: remove unresolvable and resolved from vmlinux/System.map
122# remove duplicates
123foreach my $module (keys %$dep) {
124    warn "reducing module: $module\n" if $verbose;
125    $mod->{$module} = {};
126    foreach (@{$dep->{$module}}) {
127        if( $exp->{$_} ) {
128            warn "resolved symbol $_ in file $exp->{$_}\n" if $verbose;
129            next if $exp->{$_} =~ /vmlinux/;
130            $mod->{$module}{$exp->{$_}} = 1;
131        } else {
132            warn "unresolved symbol $_ in file $module\n";
133        }
134    }
135}
136
137# figure out where the output should go
138if ($stdout == 0) {
139    open(STDOUT, ">$basedir/modules.dep")
140                             or die "cannot open $basedir/modules.dep: $!";
141}
142my $kseries = $basedir =~ m,/2\.6\.[^/]*, ? '2.6' : '2.4';
143
144foreach my $module ( keys %$mod ) {
145    if($kseries eq '2.4') {
146        print "$module:\t";
147        my @sorted = sort bydep keys %{$mod->{$module}};
148        print join(" \\\n\t",@sorted);
149        print "\n\n";
150    } else {
151        print "$module: ";
152        my @sorted = sort bydep keys %{$mod->{$module}};
153        print join(" ",@sorted);
154        print "\n";
155    }
156}
157
158
159sub build_ref_tables
160{
161    my ($name, $sym_ar, $exp, $dep) = @_;
162
163    my $ksymtab = grep m/ __ksymtab/, @$sym_ar;
164
165    # gather the exported symbols
166    if($ksymtab){
167        # explicitly exported
168        foreach ( @$sym_ar ) {
169            / __ksymtab_(.*)$/ and do {
170                warn "sym = $1\n" if $verbose;
171                $exp->{$1} = $name;
172            };
173        }
174    } else {
175        # exporting all symbols
176        foreach ( @$sym_ar ) {
177            / [ABCDGRST] (.*)$/ and do {
178                warn "syma = $1\n" if $verbose;
179                $exp->{$1} = $name;
180            };
181        }
182    }
183
184    # this takes makes sure modules with no dependencies get listed
185    push @{$dep->{$name}}, 'printk' unless $name eq 'vmlinux';
186
187    # gather the unresolved symbols
188    foreach ( @$sym_ar ) {
189        !/ __this_module/ && / U (.*)$/ and do {
190            warn "und = $1\n" if $verbose;
191            push @{$dep->{$name}}, $1;
192        };
193    }
194}
195
196sub bydep
197{
198    foreach my $f ( keys %{$mod->{$b}} ) {
199        if($f eq $a) {
200            return 1;
201        }
202    }
203    return -1;
204}
205
206
207
208__END__
209
210=head1 NAME
211
212depmod.pl - a cross platform script to generate kernel module
213dependency lists (modules.conf) which can then be used by modprobe
214on the target platform.
215
216It supports Linux 2.4 and 2.6 styles of modules.conf (auto-detected)
217
218=head1 SYNOPSIS
219
220depmod.pl [OPTION]... [basedir]...
221
222Example:
223
224    depmod.pl -F linux/System.map -b target/lib/modules/2.6.11
225
226=head1 DESCRIPTION
227
228The purpose of this script is to automagically generate a list of of kernel
229module dependencies.  This script produces dependency lists that should be
230identical to the depmod program from the modutils package.  Unlike the depmod
231binary, however, depmod.pl is designed to be run on your host system, not
232on your target system.
233
234This script was written by David Schleef <ds@schleef.org> to be used in
235conjunction with the BusyBox modprobe applet.
236
237=head1 OPTIONS
238
239=over 4
240
241=item B<-h --help>
242
243This displays the help message.
244
245=item B<-b --basedir>
246
247The base directory uner which the target's modules will be found.  This
248defaults to the /lib/modules directory.
249
250If you don't specify the kernel version, this script will search for
251one under the specified based directory and use the first thing that
252looks like a kernel version.
253
254=item B<-k --kernel>
255
256Kernel binary for the target (vmlinux).  You must either supply a kernel binary
257or a kernel symbol file (using the -F option).
258
259=item B<-F --kernelsyms>
260
261Kernel symbol file for the target (System.map).
262
263=item B<-n --stdout>
264
265Write to stdout instead of modules.dep
266kernel binary for the target (using the -k option).
267
268=item B<--verbose>
269
270Verbose (debug) output
271
272=back
273
274=head1 COPYRIGHT AND LICENSE
275
276 Copyright (c) 2001 David Schleef <ds@schleef.org>
277 Copyright (c) 2001 Erik Andersen <andersen@codepoet.org>
278 Copyright (c) 2001 Stuart Hughes <seh@zee2.com>
279 Copyright (c) 2002 Steven J. Hill <shill@broadcom.com>
280 Copyright (c) 2006 Freescale Semiconductor, Inc <stuarth@freescale.com>
281
282This program is free software; you can redistribute it and/or modify it
283under the same terms as Perl itself.
284
285=head1 AUTHOR
286
287David Schleef <ds@schleef.org>
288
289=cut
Note: See TracBrowser for help on using the repository browser.