| From b14784e7883390c20ed3ff904892255404a5914b Mon Sep 17 00:00:00 2001 |
| From: Felix Fietkau <nbd@nbd.name> |
| Date: Fri, 7 Jul 2017 17:05:53 +0200 |
| Subject: add an optional config option for stripping all unnecessary symbol exports from the kernel image |
| |
| lede-commit: bb5a40c64b7c4f4848509fa0a6625055fc9e66cc |
| Signed-off-by: Felix Fietkau <nbd@nbd.name> |
| --- |
| include/asm-generic/vmlinux.lds.h | 18 +++++++++++++++--- |
| include/linux/export.h | 9 ++++++++- |
| scripts/Makefile.build | 2 +- |
| 3 files changed, 24 insertions(+), 5 deletions(-) |
| |
| --- a/include/asm-generic/vmlinux.lds.h |
| +++ b/include/asm-generic/vmlinux.lds.h |
| @@ -54,6 +54,16 @@ |
| #define LOAD_OFFSET 0 |
| #endif |
| |
| +#ifndef SYMTAB_KEEP |
| +#define SYMTAB_KEEP KEEP(*(SORT(___ksymtab+*))) |
| +#define SYMTAB_KEEP_GPL KEEP(*(SORT(___ksymtab_gpl+*))) |
| +#endif |
| + |
| +#ifndef SYMTAB_DISCARD |
| +#define SYMTAB_DISCARD |
| +#define SYMTAB_DISCARD_GPL |
| +#endif |
| + |
| /* Align . to a 8 byte boundary equals to maximum function alignment. */ |
| #define ALIGN_FUNCTION() . = ALIGN(8) |
| |
| @@ -408,14 +418,14 @@ |
| /* Kernel symbol table: Normal symbols */ \ |
| __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \ |
| __start___ksymtab = .; \ |
| - KEEP(*(SORT(___ksymtab+*))) \ |
| + SYMTAB_KEEP \ |
| __stop___ksymtab = .; \ |
| } \ |
| \ |
| /* Kernel symbol table: GPL-only symbols */ \ |
| __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \ |
| __start___ksymtab_gpl = .; \ |
| - KEEP(*(SORT(___ksymtab_gpl+*))) \ |
| + SYMTAB_KEEP_GPL \ |
| __stop___ksymtab_gpl = .; \ |
| } \ |
| \ |
| @@ -477,7 +487,7 @@ |
| \ |
| /* Kernel symbol table: strings */ \ |
| __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \ |
| - *(__ksymtab_strings) \ |
| + *(__ksymtab_strings+*) \ |
| } \ |
| \ |
| /* __*init sections */ \ |
| @@ -917,6 +927,8 @@ |
| /DISCARD/ : { \ |
| EXIT_DISCARDS \ |
| EXIT_CALL \ |
| + SYMTAB_DISCARD \ |
| + SYMTAB_DISCARD_GPL \ |
| *(.discard) \ |
| *(.discard.*) \ |
| *(.modinfo) \ |
| --- a/include/linux/export.h |
| +++ b/include/linux/export.h |
| @@ -98,18 +98,26 @@ struct kernel_symbol { |
| |
| #else |
| |
| +#ifdef MODULE |
| +#define __EXPORT_SUFFIX(sym) |
| +#else |
| +#define __EXPORT_SUFFIX(sym) "+" #sym |
| +#endif |
| + |
| #define ___export_symbol_common(sym, sec) \ |
| extern typeof(sym) sym; \ |
| __CRC_SYMBOL(sym, sec); \ |
| static const char __kstrtab_##sym[] \ |
| - __attribute__((section("__ksymtab_strings"), used, aligned(1))) \ |
| + __attribute__((section("__ksymtab_strings" \ |
| + __EXPORT_SUFFIX(sym)), used, aligned(1))) \ |
| = #sym \ |
| |
| /* For every exported symbol, place a struct in the __ksymtab section */ |
| #define ___EXPORT_SYMBOL_NS(sym, sec, ns) \ |
| ___export_symbol_common(sym, sec); \ |
| static const char __kstrtabns_##sym[] \ |
| - __attribute__((section("__ksymtab_strings"), used, aligned(1))) \ |
| + __attribute__((section("__ksymtab_strings" \ |
| + __EXPORT_SUFFIX(sym)), used, aligned(1))) \ |
| = #ns; \ |
| __KSYMTAB_ENTRY_NS(sym, sec) |
| |
| --- a/scripts/Makefile.build |
| +++ b/scripts/Makefile.build |
| @@ -350,7 +350,7 @@ targets += $(extra-y) $(MAKECMDGOALS) $( |
| # Linker scripts preprocessor (.lds.S -> .lds) |
| # --------------------------------------------------------------------------- |
| quiet_cmd_cpp_lds_S = LDS $@ |
| - cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -U$(ARCH) \ |
| + cmd_cpp_lds_S = $(CPP) $(EXTRA_LDSFLAGS) $(cpp_flags) -P -U$(ARCH) \ |
| -D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $< |
| |
| $(obj)/%.lds: $(src)/%.lds.S FORCE |