2004-03-01 14:35:00

by Marcelo Tosatti

[permalink] [raw]
Subject: Re: finding unused globals in the kernel


On Sat, 28 Feb 2004, Arnd Bergmann wrote:

> I've been looking for a way to find symbols in the kernel that
> are not referenced anywhere and could be removed. This script is
> what I came up with, it's rather slow and complicated, but I have
> managed to find quite a bit of dead code with it.
>
> It will also write a message for symbols that are both defined
> static and global in some places, that information is available
> for free here.
>
> Going through the output might be a long-term task for the
> janitors.
>
> As an example, I'm including the output of the script for the
> current i386 defconfig.

<snip>

> bash /home/arnd/linux-2.6-ipc/scripts/checkunused.sh i386 arch/i386/kernel/head.o arch/i386/kernel/init_task.o init/built-in.o usr/built-in.o arch/i386/kernel/built-in.o arch/i386/mm/built-in.o arch/i386/mach-default/built-in.o kernel/built-in.o mm/built-in.o fs/built-in.o ipc/built-in.o security/built-in.o crypto/built-in.o lib/lib.a arch/i386/lib/lib.a lib/built-in.o arch/i386/lib/built-in.o drivers/built-in.o sound/built-in.o arch/i386/pci/built-in.o arch/i386/oprofile/built-in.o arch/i386/power/built-in.o net/built-in.o
> unreferenced definition VSYSCALL_BASE

Hi Arnd,

It seems your script is behaving wrongly for the VSYSCALL_BASE case
(probably others too):

elf.h:

#define VSYSCALL_BASE (__fix_to_virt(FIX_VSYSCALL))
#define VSYSCALL_EHDR ((const struct elfhdr *) VSYSCALL_BASE)
#define VSYSCALL_ENTRY ((unsigned long) &__kernel_vsyscall)
extern void __kernel_vsyscall;







2004-03-01 19:35:32

by Arnd Bergmann

[permalink] [raw]
Subject: Re: finding unused globals in the kernel

On Monday 01 March 2004 15:32, Marcelo Tosatti wrote:
>
> On Sat, 28 Feb 2004, Arnd Bergmann wrote:
> > bash /home/arnd/linux-2.6-ipc/scripts/checkunused.sh i386 arch/i386/kernel/head.o arch/i386/kernel/init_task.o init/built-in.o usr/built-in.o arch/i386/kernel/built-in.o arch/i386/mm/built-in.o arch/i386/mach-default/built-in.o kernel/built-in.o mm/built-in.o fs/built-in.o ipc/built-in.o security/built-in.o crypto/built-in.o lib/lib.a arch/i386/lib/lib.a lib/built-in.o arch/i386/lib/built-in.o drivers/built-in.o sound/built-in.o arch/i386/pci/built-in.o arch/i386/oprofile/built-in.o arch/i386/power/built-in.o net/built-in.o
> > unreferenced definition VSYSCALL_BASE
>
> It seems your script is behaving wrongly for the VSYSCALL_BASE case
> (probably others too):
>
> elf.h:
>
> #define VSYSCALL_BASE (__fix_to_virt(FIX_VSYSCALL))
> #define VSYSCALL_EHDR ((const struct elfhdr *) VSYSCALL_BASE)
> #define VSYSCALL_ENTRY ((unsigned long) &__kernel_vsyscall)
> extern void __kernel_vsyscall;

Actually, VSYSCALL_BASE is defined as an absolute symbol in
arch/i386/kernel/vsyscall.lds, so it's not as broken as one might think.
The bug is that the script cannot find symbols defined by the linker
and used only as a constant in the same linker script. Fortunately, this
isn't done in many places.

Arnd <><