bk://linux-sam.bkbits.net/kbuild sam@mars.ravnborg.org|ChangeSet|20040830192324|56717 sam # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/08/30 14:21:17-07:00 akpm@bix.(none) # Merge bk://linux-sam.bkbits.net/kbuild # into bix.(none):/usr/src/bk-kbuild # # Makefile # 2004/08/30 14:21:13-07:00 akpm@bix.(none) +0 -0 # Auto merged # # BitKeeper/etc/ignore # 2004/08/30 14:21:09-07:00 akpm@bix.(none) +1 -1 # auto-union # # ChangeSet # 2004/08/30 21:23:24+02:00 sam@mars.ravnborg.org # kbuild: Add stactic analyser tools to make help # # Added the tools that seems to be maintained. # There is a bunch that has not been touched for a while - ignore them for now. # # Signed-off-by: Sam Ravnborg # # Makefile # 2004/08/30 21:23:05+02:00 sam@mars.ravnborg.org +9 -3 # Updated help and use $(srctree) as replacement for $(src) # # ChangeSet # 2004/08/30 20:51:06+02:00 sam@mars.ravnborg.org # kbuild: Updates to namespacecheck.pl # # From: Keith Owens # # This now supports the absolute symbols from modversions, handles # recent binutils changes and supports O=. # # Signed-off-by: Keith Owens # Signed-off-by: Sam Ravnborg # # scripts/namespace.pl # 2004/08/30 20:50:49+02:00 sam@mars.ravnborg.org +86 -53 # This now supports the absolute symbols from modversions, handles # recent binutils changes and supports O=. # # ChangeSet # 2004/08/30 20:38:47+02:00 sam@mars.ravnborg.org # bk: Ignore arch/i386/kernel/vsyscall.lds # # Signed-off-by: Sam Ravnborg # # BitKeeper/etc/ignore # 2004/08/30 20:37:31+02:00 sam@mars.ravnborg.org +1 -0 # added arch/i386/kernel/vsyscall.lds # # ChangeSet # 2004/08/30 20:34:05+02:00 sam@mars.ravnborg.org # kbuild: fix stage 2 of module build # # When building allmodconfig the following error were seen: # scripts/Makefile.modpost:86: target `fs/nls/nls_koi8-ru.ko' given more than once in the same rule. # This happened for all modules with 'ko' inside their name. # This bug were introduced when head ... were replaced by grep. # # Signed off by: Sam Ravnborg # # scripts/Makefile.modpost # 2004/08/30 20:33:49+02:00 sam@mars.ravnborg.org +1 -1 # grep .ko would match any string with ko in it. # Limit this to strings with the suffix .ko # # ChangeSet # 2004/08/30 00:21:05-07:00 akpm@bix.(none) # Merge bk://linux-sam.bkbits.net/kbuild # into bix.(none):/usr/src/bk-kbuild # # Makefile # 2004/08/30 00:21:01-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/08/29 10:17:02+02:00 kaos@ocs.com.au # kbuild: Add 'make namespacecheck' # # make namespacecheck lists globally visible symbols that are not used # outside the file that defines them. These symbols are candidates for # static declarations. It also lists multiply defined symbols. # namespace.pl knows about lots of special cases in the kernel code, # including exported symbols and conglomerate objects. # # The patch also corrects the usage of scripts/reference*.pl, they need # $(src). # # Signed-off-by: Keith Owens # Signed-off-by: Sam Ravnborg # # Index: 2.6.9-rc1/Makefile # =================================================================== # # Makefile # 2004/08/29 09:27:51+02:00 kaos@ocs.com.au +5 -2 # kbuild: Add 'make namespacecheck' # # scripts/namespace.pl # 2004/08/29 09:53:21+02:00 kaos@ocs.com.au +416 -0 # kbuild: Add 'make namespacecheck' # # scripts/namespace.pl # 2004/08/29 09:53:21+02:00 kaos@ocs.com.au +0 -0 # BitKeeper file /home/sam/bk/kbuild/scripts/namespace.pl # # ChangeSet # 2004/08/29 09:32:19+02:00 trini@kernel.crashing.org # kbuild: Solaris fixes in various kbuild Makfiles's # # Additional Makefile fixes for Solaris 2.8 # # On Solaris, 'head' doesn't take a -q argument. But we can use 'grep -h' # instead, so do that in Makefile.mod{inst,post}. The built-in test to # /bin/sh doesn't like 'if ! cmd' syntax, so when determining if we need # to do modversion stuff, invert the if/else cases. The built-in test # also doesn't understand -ef, so invoke a real version of test which does. # # Signed-off-by: Tom Rini # Signed-off-by: Sam Ravnborg # # scripts/Makefile.modpost # 2004/08/27 23:47:07+02:00 trini@kernel.crashing.org +1 -1 # kbuild: Solaris fixes in various kbuild Makfiles's # # scripts/Makefile.modinst # 2004/08/27 23:47:07+02:00 trini@kernel.crashing.org +1 -1 # kbuild: Solaris fixes in various kbuild Makfiles's # # scripts/Makefile.build # 2004/08/27 23:47:07+02:00 trini@kernel.crashing.org +3 -3 # kbuild: Solaris fixes in various kbuild Makfiles's # # Makefile # 2004/08/27 23:47:07+02:00 trini@kernel.crashing.org +4 -4 # kbuild: Solaris fixes in various kbuild Makfiles's # # ChangeSet # 2004/08/29 09:31:53+02:00 trini@kernel.crashing.org # kbuild: Use getopt_long in genksyms only when available # # Use getopt_long() or getopt(), depending on the host # # From: Jean-Christophe Dubois . # # We do not always have GNU getopt_long(), so when we don't, just use # getopt() and the short options. We do this based on __GNU_LIBRARY__ # being set, or not. Originally from Jean-Christophe Dubois . # # Signed-off-by: Tom Rini # Signed-off-by: Sam Ravnborg # # scripts/genksyms/genksyms.c # 2004/08/27 23:47:06+02:00 trini@kernel.crashing.org +15 -0 # kbuild: Use getopt_long in genksyms only when available # # ChangeSet # 2004/08/29 09:31:26+02:00 trini@kernel.crashing.org # kbuild: Use inttypes.h when stdint.h are not available # # The following is from Jean-Christophe Dubois . # On Solaris 2.8, does not exist, but does. # However, on Cygwin (the other odd place that the kernel is compiled # on) doesn't exist. So we end up testing for __sun__ and # using there, and everywhere else. # # Signed-off-by: Tom Rini # Signed-off-by: Sam Ravnborg # # scripts/mod/sumversion.c # 2004/08/27 23:29:36+02:00 trini@kernel.crashing.org +4 -0 # kbuild: Use inttypes.h when stdint.h are not available # # arch/ppc/boot/utils/mktree.c # 2004/08/27 23:29:36+02:00 trini@kernel.crashing.org +4 -0 # kbuild: Use inttypes.h when stdint.h are not available # # arch/ppc/boot/utils/mkbugboot.c # 2004/08/27 23:29:36+02:00 trini@kernel.crashing.org +6 -6 # kbuild: Use inttypes.h when stdint.h are not available # # ChangeSet # 2004/08/28 00:00:41-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-kbuild # # arch/arm/Kconfig # 2004/08/28 00:00:37-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/08/25 19:48:54-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-kbuild # # arch/arm/Kconfig # 2004/08/25 19:48:50-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/08/24 17:59:43-07:00 akpm@bix.(none) # Merge bk://linux-sam.bkbits.net/kbuild # into bix.(none):/usr/src/bk-kbuild # # arch/arm/kernel/Makefile # 2004/08/24 17:59:40-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/arm/Makefile # 2004/08/24 17:59:40-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/arm/Kconfig # 2004/08/24 17:59:40-07:00 akpm@bix.(none) +0 -0 # Auto merged # # Makefile # 2004/08/24 17:59:39-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/08/24 17:58:41-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-kbuild # # Makefile # 2004/08/24 17:58:37-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/08/23 16:58:47-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-kbuild # # arch/arm/kernel/Makefile # 2004/08/23 16:58:43-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/arm/Makefile # 2004/08/23 16:58:43-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/arm/Kconfig # 2004/08/23 16:58:43-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/08/22 21:25:37-07:00 akpm@bix.(none) # Merge bk://linux-sam.bkbits.net/kbuild # into bix.(none):/usr/src/bk-kbuild # # arch/arm/Makefile # 2004/08/22 21:25:33-07:00 akpm@bix.(none) +0 -0 # Auto merged # # Makefile # 2004/08/22 21:25:33-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/08/22 21:24:37-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-kbuild # # arch/arm/kernel/Makefile # 2004/08/22 21:24:33-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/arm/Makefile # 2004/08/22 21:24:33-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/arm/Kconfig # 2004/08/22 21:24:33-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/08/18 14:22:47-07:00 akpm@bix.(none) # Merge bk://linux-sam.bkbits.net/kbuild # into bix.(none):/usr/src/bk-kbuild # # Makefile # 2004/08/18 14:22:43-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/08/15 13:46:26-07:00 akpm@bix.(none) # Merge bk://linux-sam.bkbits.net/kbuild # into bix.(none):/usr/src/bk-kbuild # # Makefile # 2004/08/15 13:46:22-07:00 akpm@bix.(none) +0 -0 # Auto merged # # BitKeeper/etc/ignore # 2004/08/15 13:46:17-07:00 akpm@bix.(none) +13 -1 # auto-union # # ChangeSet # 2004/08/15 01:10:55-07:00 akpm@bix.(none) # Merge bk://linux-sam.bkbits.net/kbuild # into bix.(none):/usr/src/bk-kbuild # # Makefile # 2004/08/15 01:10:51-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/07/31 15:34:22-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-kbuild # # BitKeeper/etc/ignore # 2004/07/31 15:34:14-07:00 akpm@bix.(none) +0 -42 # auto-union # # ChangeSet # 2004/07/29 23:26:18-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-kbuild # # BitKeeper/etc/ignore # 2004/07/29 23:26:10-07:00 akpm@bix.(none) +42 -38 # auto-union # diff -Nru a/Makefile b/Makefile --- a/Makefile 2004-08-30 17:36:48 -07:00 +++ b/Makefile 2004-08-30 17:36:48 -07:00 @@ -673,10 +673,10 @@ # using a seperate output directory. This allows convinient use # of make in output directory prepare2: - $(Q)if [ ! $(srctree) -ef $(objtree) ]; then \ - $(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \ - $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL) \ - > $(objtree)/Makefile; \ + $(Q)if /usr/bin/env test ! $(srctree) -ef $(objtree); then \ + $(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \ + $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL) \ + > $(objtree)/Makefile; \ fi # prepare1 is used to check if we are building in a separate output directory, @@ -963,7 +963,13 @@ @echo ' rpm - Build a kernel as an RPM package' @echo ' tags/TAGS - Generate tags file for editors' @echo ' cscope - Generate cscope index' + @echo '' + @echo 'Static analysers' + @echo ' buildcheck - List dangling references to vmlinux discarded sections' + @echo ' and init sections from non-init sections' @echo ' checkstack - Generate a list of stack hogs' + @echo ' namespacecheck - Name space analysis on compiled kernel' + @echo '' @echo 'Kernel packaging:' @$(MAKE) -f $(package-dir)/Makefile help @echo '' @@ -1123,8 +1129,11 @@ | xargs $(PERL) -w scripts/checkversion.pl buildcheck: - $(PERL) scripts/reference_discarded.pl - $(PERL) scripts/reference_init.pl + $(PERL) $(srctree)/scripts/reference_discarded.pl + $(PERL) $(srctree)/scripts/reference_init.pl + +namespacecheck: + $(PERL) $(srctree)/scripts/namespace.pl endif #ifeq ($(config-targets),1) endif #ifeq ($(mixed-targets),1) diff -Nru a/arch/ppc/boot/utils/mkbugboot.c b/arch/ppc/boot/utils/mkbugboot.c --- a/arch/ppc/boot/utils/mkbugboot.c 2004-08-30 17:36:48 -07:00 +++ b/arch/ppc/boot/utils/mkbugboot.c 2004-08-30 17:36:48 -07:00 @@ -1,5 +1,5 @@ /* - * arch/ppc/pp3boot/mkbugboot.c + * arch/ppc/boot/utils/mkbugboot.c * * Makes a Motorola PPCBUG ROM bootable image which can be flashed * into one of the FLASH banks on a Motorola PowerPlus board. @@ -21,6 +21,11 @@ #include #include #include +#ifdef __sun__ +#include +#else +#include +#endif #ifdef __i386__ #define cpu_to_be32(x) le32_to_cpu(x) @@ -48,11 +53,6 @@ /* size of read buffer */ #define SIZE 0x1000 - -/* typedef long int32_t; */ -typedef unsigned long uint32_t; -typedef unsigned short uint16_t; -typedef unsigned char uint8_t; /* PPCBUG ROM boot header */ typedef struct bug_boot_header { diff -Nru a/arch/ppc/boot/utils/mktree.c b/arch/ppc/boot/utils/mktree.c --- a/arch/ppc/boot/utils/mktree.c 2004-08-30 17:36:48 -07:00 +++ b/arch/ppc/boot/utils/mktree.c 2004-08-30 17:36:48 -07:00 @@ -15,7 +15,11 @@ #include #include #include +#ifdef __sun__ +#include +#else #include +#endif /* This gets tacked on the front of the image. There are also a few * bytes allocated after the _start label used by the boot rom (see diff -Nru a/scripts/Makefile.build b/scripts/Makefile.build --- a/scripts/Makefile.build 2004-08-30 17:36:48 -07:00 +++ b/scripts/Makefile.build 2004-08-30 17:36:48 -07:00 @@ -160,9 +160,7 @@ cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $< cmd_modversions = \ - if ! $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \ - mv $(@D)/.tmp_$(@F) $@; \ - else \ + if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \ $(CPP) -D__GENKSYMS__ $(c_flags) $< \ | $(GENKSYMS) \ > $(@D)/.tmp_$(@F:.o=.ver); \ @@ -170,6 +168,8 @@ $(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) \ -T $(@D)/.tmp_$(@F:.o=.ver); \ rm -f $(@D)/.tmp_$(@F) $(@D)/.tmp_$(@F:.o=.ver); \ + else \ + mv $(@D)/.tmp_$(@F) $@; \ fi; endif diff -Nru a/scripts/Makefile.modinst b/scripts/Makefile.modinst --- a/scripts/Makefile.modinst 2004-08-30 17:36:48 -07:00 +++ b/scripts/Makefile.modinst 2004-08-30 17:36:48 -07:00 @@ -9,7 +9,7 @@ # -__modules := $(sort $(shell head -q -n1 /dev/null $(wildcard $(MODVERDIR)/*.mod))) +__modules := $(sort $(shell grep -h .ko /dev/null $(wildcard $(MODVERDIR)/*.mod))) modules := $(patsubst %.o,%.ko,$(wildcard $(__modules:.ko=.o))) .PHONY: $(modules) diff -Nru a/scripts/Makefile.modpost b/scripts/Makefile.modpost --- a/scripts/Makefile.modpost 2004-08-30 17:36:48 -07:00 +++ b/scripts/Makefile.modpost 2004-08-30 17:36:48 -07:00 @@ -41,7 +41,7 @@ symverfile := $(objtree)/Module.symvers # Step 1), find all modules listed in $(MODVERDIR)/ -__modules := $(sort $(shell head -q -n1 /dev/null $(wildcard $(MODVERDIR)/*.mod))) +__modules := $(sort $(shell grep -h '\.ko' /dev/null $(wildcard $(MODVERDIR)/*.mod))) modules := $(patsubst %.o,%.ko, $(wildcard $(__modules:.ko=.o))) _modpost: $(modules) diff -Nru a/scripts/genksyms/genksyms.c b/scripts/genksyms/genksyms.c --- a/scripts/genksyms/genksyms.c 2004-08-30 17:36:48 -07:00 +++ b/scripts/genksyms/genksyms.c 2004-08-30 17:36:48 -07:00 @@ -27,7 +27,9 @@ #include #include #include +#ifdef __GNU_LIBRARY__ #include +#endif /* __GNU_LIBRARY__ */ #include "genksyms.h" @@ -502,12 +504,21 @@ fputs("Usage:\n" "genksyms [-dDwqhV] > /path/to/.tmp_obj.ver\n" "\n" +#ifdef __GNU_LIBRARY__ " -d, --debug Increment the debug level (repeatable)\n" " -D, --dump Dump expanded symbol defs (for debugging only)\n" " -w, --warnings Enable warnings\n" " -q, --quiet Disable warnings (default)\n" " -h, --help Print this message\n" " -V, --version Print the release version\n" +#else /* __GNU_LIBRARY__ */ + " -d Increment the debug level (repeatable)\n" + " -D Dump expanded symbol defs (for debugging only)\n" + " -w Enable warnings\n" + " -q Disable warnings (default)\n" + " -h Print this message\n" + " -V Print the release version\n" +#endif /* __GNU_LIBRARY__ */ , stderr); } @@ -516,6 +527,7 @@ { int o; +#ifdef __GNU_LIBRARY__ struct option long_opts[] = { {"debug", 0, 0, 'd'}, {"warnings", 0, 0, 'w'}, @@ -528,6 +540,9 @@ while ((o = getopt_long(argc, argv, "dwqVDk:p:", &long_opts[0], NULL)) != EOF) +#else /* __GNU_LIBRARY__ */ + while ((o = getopt(argc, argv, "dwqVDk:p:")) != EOF) +#endif /* __GNU_LIBRARY__ */ switch (o) { case 'd': diff -Nru a/scripts/mod/sumversion.c b/scripts/mod/sumversion.c --- a/scripts/mod/sumversion.c 2004-08-30 17:36:48 -07:00 +++ b/scripts/mod/sumversion.c 2004-08-30 17:36:48 -07:00 @@ -1,5 +1,9 @@ #include +#ifdef __sun__ +#include +#else #include +#endif #include #include #include diff -Nru a/scripts/namespace.pl b/scripts/namespace.pl --- /dev/null Wed Dec 31 16:00:00 196900 +++ b/scripts/namespace.pl 2004-08-30 17:36:48 -07:00 @@ -0,0 +1,449 @@ +#!/usr/bin/perl -w +# +# namespace.pl. Mon Aug 30 2004 +# +# Perform a name space analysis on the linux kernel. +# +# Copyright Keith Owens . GPL. +# +# Invoke by changing directory to the top of the kernel object +# tree then namespace.pl, no parameters. +# +# Tuned for 2.1.x kernels with the new module handling, it will +# work with 2.0 kernels as well. +# +# Last change 2.6.9-rc1, adding support for separate source and object +# trees. +# +# The source must be compiled/assembled first, the object files +# are the primary input to this script. Incomplete or missing +# objects will result in a flawed analysis. Compile both vmlinux +# and modules. +# +# Even with complete objects, treat the result of the analysis +# with caution. Some external references are only used by +# certain architectures, others with certain combinations of +# configuration parameters. Ideally the source should include +# something like +# +# #ifndef CONFIG_... +# static +# #endif +# symbol_definition; +# +# so the symbols are defined as static unless a particular +# CONFIG_... requires it to be external. +# +# A symbol that is suffixed with '(export only)' has these properties +# +# * It is global. +# * It is marked EXPORT_SYMBOL or EXPORT_SYMBOL_GPL, either in the same +# source file or a different source file. +# * Given the current .config, nothing uses the symbol. +# +# The symbol is a candidate for conversion to static, plus removal of the +# export. But be careful that a different .config might use the symbol. +# +# +# Name space analysis and cleanup is an iterative process. You cannot +# expect to find all the problems in a single pass. +# +# * Identify possibly unnecessary global declarations, verify that they +# really are unnecessary and change them to static. +# * Compile and fix up gcc warnings about static, removing dead symbols +# as necessary. +# * make clean and rebuild with different configs (especially +# CONFIG_MODULES=n) to see which symbols are being defined when the +# config does not require them. These symbols bloat the kernel object +# for no good reason, which is frustrating for embedded systems. +# * Wrap config sensitive symbols in #ifdef CONFIG_foo, as long as the +# code does not get too ugly. +# * Repeat the name space analysis until you can live with with the +# result. +# + +require 5; # at least perl 5 +use strict; +use File::Find; + +my $nm = "/usr/bin/nm -p"; +my $objdump = "/usr/bin/objdump -s -j .comment"; +my $srctree = ""; +my $objtree = ""; +$srctree = "$ENV{'srctree'}/" if (exists($ENV{'srctree'})); +$objtree = "$ENV{'objtree'}/" if (exists($ENV{'objtree'})); + +if ($#ARGV != -1) { + print STDERR "usage: $0 takes no parameters\n"; + die("giving up\n"); +} + +my %nmdata = (); # nm data for each object +my %def = (); # all definitions for each name +my %ksymtab = (); # names that appear in __ksymtab_ +my %ref = (); # $ref{$name} exists if there is a true external reference to $name +my %export = (); # $export{$name} exists if there is an EXPORT_... of $name + +&find(\&linux_objects, '.'); # find the objects and do_nm on them +&list_multiply_defined(); +&resolve_external_references(); +&list_extra_externals(); + +exit(0); + +sub linux_objects +{ + # Select objects, ignoring objects which are only created by + # merging other objects. Also ignore all of modules, scripts + # and compressed. Most conglomerate objects are handled by do_nm, + # this list only contains the special cases. These include objects + # that are linked from just one other object and objects for which + # there is really no permanent source file. + my $basename = $_; + $_ = $File::Find::name; + s:^\./::; + if (/.*\.o$/ && + ! ( + m:/built-in.o$: + || m:arch/i386/kernel/vsyscall-syms.o$: + || m:arch/ia64/ia32/ia32.o$: + || m:arch/ia64/kernel/gate-syms.o$: + || m:arch/ia64/lib/__divdi3.o$: + || m:arch/ia64/lib/__divsi3.o$: + || m:arch/ia64/lib/__moddi3.o$: + || m:arch/ia64/lib/__modsi3.o$: + || m:arch/ia64/lib/__udivdi3.o$: + || m:arch/ia64/lib/__udivsi3.o$: + || m:arch/ia64/lib/__umoddi3.o$: + || m:arch/ia64/lib/__umodsi3.o$: + || m:arch/ia64/scripts/check_gas_for_hint.o$: + || m:arch/ia64/sn/kernel/xp.o$: + || m:boot/bbootsect.o$: + || m:boot/bsetup.o$: + || m:/bootsect.o$: + || m:/boot/setup.o$: + || m:/compressed/: + || m:drivers/cdrom/driver.o$: + || m:drivers/char/drm/tdfx_drv.o$: + || m:drivers/ide/ide-detect.o$: + || m:drivers/ide/pci/idedriver-pci.o$: + || m:drivers/media/media.o$: + || m:drivers/scsi/sd_mod.o$: + || m:drivers/video/video.o$: + || m:fs/devpts/devpts.o$: + || m:fs/exportfs/exportfs.o$: + || m:fs/hugetlbfs/hugetlbfs.o$: + || m:fs/msdos/msdos.o$: + || m:fs/nls/nls.o$: + || m:fs/ramfs/ramfs.o$: + || m:fs/romfs/romfs.o$: + || m:fs/vfat/vfat.o$: + || m:init/mounts.o$: + || m:^modules/: + || m:net/netlink/netlink.o$: + || m:net/sched/sched.o$: + || m:/piggy.o$: + || m:^scripts/: + || m:sound/.*/snd-: + || m:^.*/\.tmp_: + || m:^\.tmp_: + || m:/vmlinux-obj.o$: + ) + ) { + do_nm($basename, $_); + } + $_ = $basename; # File::Find expects $_ untouched (undocumented) +} + +sub do_nm +{ + my ($basename, $fullname) = @_; + my ($source, $type, $name); + if (! -e $basename) { + printf STDERR "$basename does not exist\n"; + return; + } + if ($fullname !~ /\.o$/) { + printf STDERR "$fullname is not an object file\n"; + return; + } + ($source = $fullname) =~ s/\.o$//; + if (-e "$objtree$source.c" || -e "$objtree$source.S") { + $source = "$objtree$source"; + } else { + $source = "$srctree$source"; + } + if (! -e "$source.c" && ! -e "$source.S") { + # No obvious source, exclude the object if it is conglomerate + if (! open(OBJDUMPDATA, "$objdump $basename|")) { + printf STDERR "$objdump $fullname failed $!\n"; + return; + } + my $comment; + while () { + chomp(); + if (/^In archive/) { + # Archives are always conglomerate + $comment = "GCC:GCC:"; + last; + } + next if (! /^[ 0-9a-f]{5,} /); + $comment .= substr($_, 43); + } + close(OBJDUMPDATA); + if (!defined($comment) || $comment !~ /GCC\:.*GCC\:/m) { + printf STDERR "No source file found for $fullname\n"; + } + return; + } + if (! open(NMDATA, "$nm $basename|")) { + printf STDERR "$nm $fullname failed $!\n"; + return; + } + my @nmdata; + while () { + chop; + ($type, $name) = (split(/ +/, $_, 3))[1..2]; + # Expected types + # A absolute symbol + # B weak external reference to data that has been resolved + # C global variable, uninitialised + # D global variable, initialised + # G global variable, initialised, small data section + # R global array, initialised + # S global variable, uninitialised, small bss + # T global label/procedure + # U external reference + # W weak external reference to text that has been resolved + # a assembler equate + # b static variable, uninitialised + # d static variable, initialised + # g static variable, initialised, small data section + # r static array, initialised + # s static variable, uninitialised, small bss + # t static label/procedures + # w weak external reference to text that has not been resolved + # ? undefined type, used a lot by modules + if ($type !~ /^[ABCDGRSTUWabdgrstw?]$/) { + printf STDERR "nm output for $fullname contains unknown type '$_'\n"; + } + elsif ($name =~ /\./) { + # name with '.' is local static + } + else { + $type = 'R' if ($type eq '?'); # binutils replaced ? with R at one point + # binutils keeps changing the type for exported symbols, force it to R + $type = 'R' if ($name =~ /^__ksymtab/ || $name =~ /^__kstrtab/); + $name =~ s/_R[a-f0-9]{8}$//; # module versions adds this + if ($type =~ /[ABCDGRSTW]/ && + $name ne 'init_module' && + $name ne 'cleanup_module' && + $name ne 'Using_Versions' && + $name !~ /^Version_[0-9]+$/ && + $name !~ /^__parm_/ && + $name !~ /^__kstrtab/ && + $name !~ /^__ksymtab/ && + $name !~ /^__kcrctab_/ && + $name !~ /^__exitcall_/ && + $name !~ /^__initcall_/ && + $name !~ /^__kdb_initcall_/ && + $name !~ /^__kdb_exitcall_/ && + $name !~ /^__module_/ && + $name !~ /^__mod_/ && + $name !~ /^__crc_/ && + $name ne '__this_module' && + $name ne 'kernel_version') { + if (!exists($def{$name})) { + $def{$name} = []; + } + push(@{$def{$name}}, $fullname); + } + push(@nmdata, "$type $name"); + if ($name =~ /^__ksymtab_/) { + $name = substr($name, 10); + if (!exists($ksymtab{$name})) { + $ksymtab{$name} = []; + } + push(@{$ksymtab{$name}}, $fullname); + } + } + } + close(NMDATA); + if ($#nmdata < 0) { + if ( + $fullname ne "lib/brlock.o" + && $fullname ne "lib/dec_and_lock.o" + && $fullname ne "fs/xfs/xfs_macros.o" + && $fullname ne "drivers/ide/ide-probe-mini.o" + && $fullname ne "usr/initramfs_data.o" + && $fullname ne "drivers/acpi/executer/exdump.o" + && $fullname ne "drivers/acpi/resources/rsdump.o" + && $fullname ne "drivers/acpi/namespace/nsdumpdv.o" + && $fullname ne "drivers/acpi/namespace/nsdump.o" + && $fullname ne "arch/ia64/sn/kernel/sn2/io.o" + && $fullname ne "arch/ia64/kernel/gate-data.o" + && $fullname ne "drivers/ieee1394/oui.o" + && $fullname ne "security/capability.o" + && $fullname ne "sound/core/wrappers.o" + && $fullname ne "fs/ntfs/sysctl.o" + && $fullname ne "fs/jfs/jfs_debug.o" + ) { + printf "No nm data for $fullname\n"; + } + return; + } + $nmdata{$fullname} = \@nmdata; +} + +sub drop_def +{ + my ($object, $name) = @_; + my $nmdata = $nmdata{$object}; + my ($i, $j); + for ($i = 0; $i <= $#{$nmdata}; ++$i) { + if ($name eq (split(' ', $nmdata->[$i], 2))[1]) { + splice(@{$nmdata{$object}}, $i, 1); + my $def = $def{$name}; + for ($j = 0; $j < $#{$def{$name}}; ++$j) { + if ($def{$name}[$j] eq $object) { + splice(@{$def{$name}}, $j, 1); + } + } + last; + } + } +} + +sub list_multiply_defined +{ + my ($name, $module); + foreach $name (keys(%def)) { + if ($#{$def{$name}} > 0) { + # Special case for cond_syscall + if ($#{$def{$name}} == 1 && $name =~ /^sys_/ && + ($def{$name}[0] eq "kernel/sys.o" || + $def{$name}[1] eq "kernel/sys.o")) { + &drop_def("kernel/sys.o", $name); + next; + } + # Special case for i386 entry code + if ($#{$def{$name}} == 1 && $name =~ /^__kernel_/ && + $def{$name}[0] eq "arch/i386/kernel/vsyscall-int80.o" && + $def{$name}[1] eq "arch/i386/kernel/vsyscall-sysenter.o") { + &drop_def("arch/i386/kernel/vsyscall-sysenter.o", $name); + next; + } + printf "$name is multiply defined in :-\n"; + foreach $module (@{$def{$name}}) { + printf "\t$module\n"; + } + } + } +} + +sub resolve_external_references +{ + my ($object, $type, $name, $i, $j, $kstrtab, $ksymtab, $export); + printf "\n"; + foreach $object (keys(%nmdata)) { + my $nmdata = $nmdata{$object}; + for ($i = 0; $i <= $#{$nmdata}; ++$i) { + ($type, $name) = split(' ', $nmdata->[$i], 2); + if ($type eq "U" || $type eq "w") { + if (exists($def{$name}) || exists($ksymtab{$name})) { + # add the owning object to the nmdata + $nmdata->[$i] = "$type $name $object"; + # only count as a reference if it is not EXPORT_... + $kstrtab = "R __kstrtab_$name"; + $ksymtab = "R __ksymtab_$name"; + $export = 0; + for ($j = 0; $j <= $#{$nmdata}; ++$j) { + if ($nmdata->[$j] eq $kstrtab || + $nmdata->[$j] eq $ksymtab) { + $export = 1; + last; + } + } + if ($export) { + $export{$name} = ""; + } + else { + $ref{$name} = "" + } + } + elsif ( $name ne "mod_use_count_" + && $name ne "__initramfs_end" + && $name ne "__initramfs_start" + && $name ne "_einittext" + && $name ne "_sinittext" + && $name ne "kallsyms_names" + && $name ne "kallsyms_num_syms" + && $name ne "kallsyms_addresses" + && $name ne "__this_module" + && $name ne "_etext" + && $name ne "_edata" + && $name ne "_end" + && $name ne "__bss_start" + && $name ne "_text" + && $name ne "_stext" + && $name ne "__gp" + && $name ne "ia64_unw_start" + && $name ne "ia64_unw_end" + && $name ne "__init_begin" + && $name ne "__init_end" + && $name ne "__bss_stop" + && $name ne "__nosave_begin" + && $name ne "__nosave_end" + && $name ne "pg0" + && $name ne "__module_text_address" + && $name !~ /^__sched_text_/ + && $name !~ /^__start_/ + && $name !~ /^__end_/ + && $name !~ /^__stop_/ + && $name !~ /^__scheduling_functions_.*_here/ + && $name !~ /^__.*initcall_/ + && $name !~ /^__.*per_cpu_start/ + && $name !~ /^__.*per_cpu_end/ + && $name !~ /^__alt_instructions/ + && $name !~ /^__setup_/ + ) { + printf "Cannot resolve "; + printf "weak " if ($type eq "w"); + printf "reference to $name from $object\n"; + } + } + } + } +} + +sub list_extra_externals +{ + my %noref = (); + my ($name, @module, $module, $export); + foreach $name (keys(%def)) { + if (! exists($ref{$name})) { + @module = @{$def{$name}}; + foreach $module (@module) { + if (! exists($noref{$module})) { + $noref{$module} = []; + } + push(@{$noref{$module}}, $name); + } + } + } + if (%noref) { + printf "\nExternally defined symbols with no external references\n"; + foreach $module (sort(keys(%noref))) { + printf " $module\n"; + foreach (sort(@{$noref{$module}})) { + if (exists($export{$_})) { + $export = " (export only)"; + } + else { + $export = ""; + } + printf " $_$export\n"; + } + } + } +}