Sample of my kernel's mostly useless symbols (starting_with:# of symbols): __func__: 624 __vendorstr_: 1760 __pci_fixup_PCI_: 116 __ksymtab_: 2597 __kstrtab_: 2597 __kcrctab_: 2597 __initcall_: 236 __devicestr_: 4686 __devices_: 1760 Total: 16973 Lines in System.map: 39735
Excluding them from in-kernel symbol table saves ~300kb: text data bss dec hex filename 4337710 1054414 259296 5651420 563bdc vmlinux.carrier1 - w/o KALLSYMS 4342068 1296046 259296 5897410 59fcc2 vmlinux - with KALLSYMS+patch 4341948 1607634 259296 6208878 5ebd6e vmlinux.carrier - with KALLSYMS ^^^^^^^ -- vda
--- linux-2.6.12.org/scripts/kallsyms.c.org Sun Jun 19 16:11:06 2005 +++ linux-2.6.12.org/scripts/kallsyms.c Wed Aug 10 23:52:06 2005 @@ -36,7 +36,7 @@ /* we use only a subset of the complete symbol table to gather the token count, * to speed up compression, at the expense of a little compression ratio */ -#define WORKING_SET 1024 +#define WORKING_SET (1024*4) /* first find the best token only on the list of tokens that would profit more * than GOOD_BAD_THRESHOLD. Only if this list is empty go to the "bad" list. @@ -102,11 +102,34 @@ usage(void) * This ignores the intensely annoying "mapping symbols" found * in ARM ELF files: $a, $t and $d. */ +/* +__func__: 624 +__vendorstr_: 1760 +__pci_fixup_PCI_: 116 +__ksymtab_: 2597 +__kstrtab_: 2597 +__kcrctab_: 2597 +__initcall_: 236 +__devicestr_: 4686 +__devices_: 1760 +Total: 16973 +Lines in System.map: 39735 +*/ static inline int is_arm_mapping_symbol(const char *str) { - return str[0] == '$' && strchr("atd", str[1]) - && (str[2] == '\0' || str[2] == '.'); + return (str[0] == '$' && strchr("atd", str[1]) + && (str[2] == '\0' || str[2] == '.') + ) + || (0 == strncmp(str, "__ksymtab_", sizeof("__ksymtab_")-1)) + || (0 == strncmp(str, "__kstrtab_", sizeof("__kstrtab_")-1)) + || (0 == strncmp(str, "__kcrctab_", sizeof("__kcrctab_")-1)) + || (0 == strncmp(str, "__devices_", sizeof("__devices_")-1)) + || (0 == strncmp(str, "__devicestr_", sizeof("__devicestr_")-1)) + || (0 == strncmp(str, "__vendorstr_", sizeof("__vendorstr_")-1)) + || (0 == strncmp(str, "__pci_fixup_PCI_", sizeof("__pci_fixup_PCI_")-1)) + || (0 == strncmp(str, "__func__", sizeof("__func__")-1)) + ; } static int