From c25f415751c0c5507561d997fe5f7f05f4342912 Mon Sep 17 00:00:00 2001 From: Amerigo Wang Date: Wed, 27 Oct 2010 12:42:00 -0700 Subject: scripts/namespace.pl: fix wrong source path File::Find will do chdir automatically, so we need to get the absolute patch with $File::Find::dir. Reported-by: Stephen Hemminger Signed-off-by: Amerigo Wang Cc: Michal Marek Signed-off-by: Andrew Morton Signed-off-by: Michal Marek --- scripts/namespace.pl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'scripts/namespace.pl') diff --git a/scripts/namespace.pl b/scripts/namespace.pl index 361d0f71184b..fb4e24560736 100755 --- a/scripts/namespace.pl +++ b/scripts/namespace.pl @@ -167,11 +167,11 @@ sub do_nm 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"; + ($source = $basename) =~ s/\.o$//; + if (-e "$source.c" || -e "$source.S") { + $source = "$objtree$File::Find::dir/$source"; } else { - $source = "$srctree$source"; + $source = "$srctree$File::Find::dir/$source"; } if (! -e "$source.c" && ! -e "$source.S") { # No obvious source, exclude the object if it is conglomerate -- cgit v1.2.2 From 43f683c9e465a64259c6058a7c313facc697b203 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Wed, 27 Oct 2010 12:42:00 -0700 Subject: scripts/namespace.pl: update file exclusion list Signed-off-by: Stephen Hemminger Signed-off-by: Amerigo Wang Cc: Michal Marek Signed-off-by: Andrew Morton Signed-off-by: Michal Marek --- scripts/namespace.pl | 103 ++++++++++++++++++++++++++++----------------------- 1 file changed, 56 insertions(+), 47 deletions(-) (limited to 'scripts/namespace.pl') diff --git a/scripts/namespace.pl b/scripts/namespace.pl index fb4e24560736..c8d0922c3b4f 100755 --- a/scripts/namespace.pl +++ b/scripts/namespace.pl @@ -84,6 +84,58 @@ 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 +my %nmexception = ( + 'fs/ext3/bitmap' => 1, + 'fs/ext4/bitmap' => 1, + 'arch/x86/lib/thunk_32' => 1, + 'arch/x86/lib/cmpxchg' => 1, + 'arch/x86/vdso/vdso32/note' => 1, + 'lib/irq_regs' => 1, + 'usr/initramfs_data' => 1, + 'drivers/scsi/aic94xx/aic94xx_dump' => 1, + 'drivers/scsi/libsas/sas_dump' => 1, + 'lib/dec_and_lock' => 1, + 'drivers/ide/ide-probe-mini' => 1, + 'usr/initramfs_data' => 1, + 'drivers/acpi/acpia/exdump' => 1, + 'drivers/acpi/acpia/rsdump' => 1, + 'drivers/acpi/acpia/nsdumpdv' => 1, + 'drivers/acpi/acpia/nsdump' => 1, + 'arch/ia64/sn/kernel/sn2/io' => 1, + 'arch/ia64/kernel/gate-data' => 1, + 'security/capability' => 1, + 'fs/ntfs/sysctl' => 1, + 'fs/jfs/jfs_debug' => 1, +); + +my %nameexception = ( + 'mod_use_count_' => 1, + '__initramfs_end' => 1, + '__initramfs_start' => 1, + '_einittext' => 1, + '_sinittext' => 1, + 'kallsyms_names' => 1, + 'kallsyms_num_syms' => 1, + 'kallsyms_addresses'=> 1, + '__this_module' => 1, + '_etext' => 1, + '_edata' => 1, + '_end' => 1, + '__bss_start' => 1, + '_text' => 1, + '_stext' => 1, + '__gp' => 1, + 'ia64_unw_start' => 1, + 'ia64_unw_end' => 1, + '__init_begin' => 1, + '__init_end' => 1, + '__bss_stop' => 1, + '__nosave_begin' => 1, + '__nosave_end' => 1, + 'pg0' => 1, +); + + &find(\&linux_objects, '.'); # find the objects and do_nm on them &list_multiply_defined(); &resolve_external_references(); @@ -270,27 +322,9 @@ sub do_nm 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; + printf "No nm data for $fullname\n" + unless $nmexception{$fullname}; + return; } $nmdata{$fullname} = \@nmdata; } @@ -372,31 +406,7 @@ sub resolve_external_references $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" + elsif ( ! $nameexception{$name} && $name !~ /^__sched_text_/ && $name !~ /^__start_/ && $name !~ /^__end_/ @@ -407,7 +417,6 @@ sub resolve_external_references && $name !~ /^__.*per_cpu_end/ && $name !~ /^__alt_instructions/ && $name !~ /^__setup_/ - && $name !~ /^jiffies/ && $name !~ /^__mod_timer/ && $name !~ /^__mod_page_state/ && $name !~ /^init_module/ -- cgit v1.2.2 From e8cf981346b78ee50c2bfce83be9ee55704b3d4f Mon Sep 17 00:00:00 2001 From: Amerigo Wang Date: Wed, 27 Oct 2010 12:42:01 -0700 Subject: scripts/namespace.pl: some bug fixes 1. Teach namespace.pl to understand "V" and "v" 2. cond_syscalls are moved into kernel/sys_ni.c Signed-off-by: Amerigo Wang Cc: Stephen Hemminger Cc: Michal Marek Signed-off-by: Andrew Morton Signed-off-by: Michal Marek --- scripts/namespace.pl | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) (limited to 'scripts/namespace.pl') diff --git a/scripts/namespace.pl b/scripts/namespace.pl index c8d0922c3b4f..bccf61044eda 100755 --- a/scripts/namespace.pl +++ b/scripts/namespace.pl @@ -266,6 +266,7 @@ sub do_nm # T global label/procedure # U external reference # W weak external reference to text that has been resolved + # V similar to W, but the value of the weak symbol becomes zero with no error. # a assembler equate # b static variable, uninitialised # d static variable, initialised @@ -274,8 +275,9 @@ sub do_nm # s static variable, uninitialised, small bss # t static label/procedures # w weak external reference to text that has not been resolved + # v similar to w # ? undefined type, used a lot by modules - if ($type !~ /^[ABCDGRSTUWabdgrstw?]$/) { + if ($type !~ /^[ABCDGRSTUWVabdgrstwv?]$/) { printf STDERR "nm output for $fullname contains unknown type '$_'\n"; } elsif ($name =~ /\./) { @@ -286,7 +288,7 @@ sub do_nm # 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]/ && + if ($type =~ /[ABCDGRSTWV]/ && $name ne 'init_module' && $name ne 'cleanup_module' && $name ne 'Using_Versions' && @@ -353,11 +355,12 @@ sub list_multiply_defined foreach my $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; + if ($#{$def{$name}} == 1 && $name =~ /^sys_/) { + if($def{$name}[0] eq "kernel/sys_ni.o" || + $def{$name}[1] eq "kernel/sys_ni.o") { + &drop_def("kernel/sys_ni.o", $name); + next; + } } # Special case for i386 entry code if ($#{$def{$name}} == 1 && $name =~ /^__kernel_/ && -- cgit v1.2.2 From abb438526201c6a79949ad45375c051b6681c253 Mon Sep 17 00:00:00 2001 From: Amerigo Wang Date: Wed, 27 Oct 2010 12:42:01 -0700 Subject: scripts/namespace.pl: improve to get more correct results Exclude more symbols from arch/x86/vdso/ and arch/x86/boot/; add some more linker-defined symbols into exception list; add other cond_syscalls besides "sys_*". Signed-off-by: Amerigo Wang Cc: Stephen Hemminger Cc: Michal Marek Signed-off-by: Andrew Morton Signed-off-by: Michal Marek --- scripts/namespace.pl | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) (limited to 'scripts/namespace.pl') diff --git a/scripts/namespace.pl b/scripts/namespace.pl index bccf61044eda..a71be6b7cdec 100755 --- a/scripts/namespace.pl +++ b/scripts/namespace.pl @@ -133,6 +133,12 @@ my %nameexception = ( '__nosave_begin' => 1, '__nosave_end' => 1, 'pg0' => 1, + 'vdso_enabled' => 1, + '__stack_chk_fail' => 1, + 'VDSO32_PRELINK' => 1, + 'VDSO32_vsyscall' => 1, + 'VDSO32_rt_sigreturn'=>1, + 'VDSO32_sigreturn' => 1, ); @@ -157,7 +163,8 @@ sub linux_objects if (/.*\.o$/ && ! ( m:/built-in.o$: - || m:arch/x86/kernel/vsyscall-syms.o$: + || m:arch/x86/vdso/: + || m:arch/x86/boot/: || m:arch/ia64/ia32/ia32.o$: || m:arch/ia64/kernel/gate-syms.o$: || m:arch/ia64/lib/__divdi3.o$: @@ -200,6 +207,7 @@ sub linux_objects || m:^.*/\.tmp_: || m:^\.tmp_: || m:/vmlinux-obj.o$: + || m:^tools/: ) ) { do_nm($basename, $_); @@ -355,20 +363,15 @@ sub list_multiply_defined foreach my $name (keys(%def)) { if ($#{$def{$name}} > 0) { # Special case for cond_syscall - if ($#{$def{$name}} == 1 && $name =~ /^sys_/) { + if ($#{$def{$name}} == 1 && + ($name =~ /^sys_/ || $name =~ /^compat_sys_/ || + $name =~ /^sys32_/)) { if($def{$name}[0] eq "kernel/sys_ni.o" || $def{$name}[1] eq "kernel/sys_ni.o") { &drop_def("kernel/sys_ni.o", $name); next; } } - # Special case for i386 entry code - if ($#{$def{$name}} == 1 && $name =~ /^__kernel_/ && - $def{$name}[0] eq "arch/x86/kernel/vsyscall-int80_32.o" && - $def{$name}[1] eq "arch/x86/kernel/vsyscall-sysenter_32.o") { - &drop_def("arch/x86/kernel/vsyscall-sysenter_32.o", $name); - next; - } printf "$name is multiply defined in :-\n"; foreach my $module (@{$def{$name}}) { -- cgit v1.2.2 From 24a54f7974a616385b96cd939e004592e2cea484 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Wed, 13 Oct 2010 15:58:30 -0700 Subject: namespace: add source file location exceptions Teach namespace checker about some special case files where the source is in unusual location. This fixes many of the source file not found errors (more can be added), and also prevents false positives for functions not being used. Signed-off-by: Stephen Hemminger Signed-off-by: Michal Marek --- scripts/namespace.pl | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'scripts/namespace.pl') diff --git a/scripts/namespace.pl b/scripts/namespace.pl index a71be6b7cdec..fd2d946fae23 100755 --- a/scripts/namespace.pl +++ b/scripts/namespace.pl @@ -141,6 +141,26 @@ my %nameexception = ( 'VDSO32_sigreturn' => 1, ); +# Files with exceptions to source file location +my %sourceloc = ( + 'net/dccp/dccp_probe.o' => 'probe', + 'net/dccp/dccp_ipv4.o' => 'ipv4', + 'net/dccp/dccp_ipv6.o' => 'ipv6', + 'net/dccp/dccp_diag.o' => 'diag', + 'drivers/char/hw_random/rng-core.o' => 'core', + 'fs/fat/msdos.o' => 'namei_msdos', + 'fs/fat/vfat.o' => 'namei_vfat', + 'fs/nfs_common/nfs_acl.o' => 'nfsacl', + 'sound/soundcore.o' => 'sound_core', + 'drivers/md/dm-mirror.o' => 'dm-raid1', + 'drivers/message/i2o/i2o_bus.o' => 'bus-osm', + 'arch/x86/kvm/kvm-amd.o' => 'svm', + 'arch/x86/kvm/kvm-intel.o' => 'vmx', + 'arch/x86/crypto/twofish-x86_64.o' => 'twofish-x86_64-asm_64', + 'arch/x86/crypto/aes-x86_64.o' => 'aes-x86_64-asm_64', + 'arch/x86/crypto/aesni-intel.o' => 'aesni-intel_asm', + 'arch/x86/crypto/salsa20-x86_64.o' => 'salsa20-x86_64-asm_64', +); &find(\&linux_objects, '.'); # find the objects and do_nm on them &list_multiply_defined(); @@ -228,11 +248,15 @@ sub do_nm return; } ($source = $basename) =~ s/\.o$//; + + $source = $sourceloc{$fullname} if ($sourceloc{$fullname}); + if (-e "$source.c" || -e "$source.S") { $source = "$objtree$File::Find::dir/$source"; } else { $source = "$srctree$File::Find::dir/$source"; } + if (! -e "$source.c" && ! -e "$source.S") { # No obvious source, exclude the object if it is conglomerate open(my $objdumpdata, "$objdump $basename|") -- cgit v1.2.2 From 9231d9e02a1f92b52bbb1e4474bfd1903835a993 Mon Sep 17 00:00:00 2001 From: Michal Marek Date: Thu, 28 Oct 2010 00:59:56 +0200 Subject: Revert "namespace: add source file location exceptions" This reverts commit 24a54f7974a616385b96cd939e004592e2cea484. Stephen Hemminger writes: > That patch should not be included. It causes more problems than it > solves, since then there are duplicate file locations which causes > false duplicate symbol reports. Reported-by: Stephen Hemminger Signed-off-by: Michal Marek --- scripts/namespace.pl | 24 ------------------------ 1 file changed, 24 deletions(-) (limited to 'scripts/namespace.pl') diff --git a/scripts/namespace.pl b/scripts/namespace.pl index fd2d946fae23..a71be6b7cdec 100755 --- a/scripts/namespace.pl +++ b/scripts/namespace.pl @@ -141,26 +141,6 @@ my %nameexception = ( 'VDSO32_sigreturn' => 1, ); -# Files with exceptions to source file location -my %sourceloc = ( - 'net/dccp/dccp_probe.o' => 'probe', - 'net/dccp/dccp_ipv4.o' => 'ipv4', - 'net/dccp/dccp_ipv6.o' => 'ipv6', - 'net/dccp/dccp_diag.o' => 'diag', - 'drivers/char/hw_random/rng-core.o' => 'core', - 'fs/fat/msdos.o' => 'namei_msdos', - 'fs/fat/vfat.o' => 'namei_vfat', - 'fs/nfs_common/nfs_acl.o' => 'nfsacl', - 'sound/soundcore.o' => 'sound_core', - 'drivers/md/dm-mirror.o' => 'dm-raid1', - 'drivers/message/i2o/i2o_bus.o' => 'bus-osm', - 'arch/x86/kvm/kvm-amd.o' => 'svm', - 'arch/x86/kvm/kvm-intel.o' => 'vmx', - 'arch/x86/crypto/twofish-x86_64.o' => 'twofish-x86_64-asm_64', - 'arch/x86/crypto/aes-x86_64.o' => 'aes-x86_64-asm_64', - 'arch/x86/crypto/aesni-intel.o' => 'aesni-intel_asm', - 'arch/x86/crypto/salsa20-x86_64.o' => 'salsa20-x86_64-asm_64', -); &find(\&linux_objects, '.'); # find the objects and do_nm on them &list_multiply_defined(); @@ -248,15 +228,11 @@ sub do_nm return; } ($source = $basename) =~ s/\.o$//; - - $source = $sourceloc{$fullname} if ($sourceloc{$fullname}); - if (-e "$source.c" || -e "$source.S") { $source = "$objtree$File::Find::dir/$source"; } else { $source = "$srctree$File::Find::dir/$source"; } - if (! -e "$source.c" && ! -e "$source.S") { # No obvious source, exclude the object if it is conglomerate open(my $objdumpdata, "$objdump $basename|") -- cgit v1.2.2