b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame] | 1 | From b14784e7883390c20ed3ff904892255404a5914b Mon Sep 17 00:00:00 2001 |
| 2 | From: Felix Fietkau <nbd@nbd.name> |
| 3 | Date: Fri, 7 Jul 2017 17:05:53 +0200 |
| 4 | Subject: add an optional config option for stripping all unnecessary symbol exports from the kernel image |
| 5 | |
| 6 | lede-commit: bb5a40c64b7c4f4848509fa0a6625055fc9e66cc |
| 7 | Signed-off-by: Felix Fietkau <nbd@nbd.name> |
| 8 | --- |
| 9 | include/asm-generic/vmlinux.lds.h | 18 +++++++++++++++--- |
| 10 | include/linux/export.h | 9 ++++++++- |
| 11 | scripts/Makefile.build | 2 +- |
| 12 | 3 files changed, 24 insertions(+), 5 deletions(-) |
| 13 | |
| 14 | --- a/include/asm-generic/vmlinux.lds.h |
| 15 | +++ b/include/asm-generic/vmlinux.lds.h |
| 16 | @@ -54,6 +54,16 @@ |
| 17 | #define LOAD_OFFSET 0 |
| 18 | #endif |
| 19 | |
| 20 | +#ifndef SYMTAB_KEEP |
| 21 | +#define SYMTAB_KEEP KEEP(*(SORT(___ksymtab+*))) |
| 22 | +#define SYMTAB_KEEP_GPL KEEP(*(SORT(___ksymtab_gpl+*))) |
| 23 | +#endif |
| 24 | + |
| 25 | +#ifndef SYMTAB_DISCARD |
| 26 | +#define SYMTAB_DISCARD |
| 27 | +#define SYMTAB_DISCARD_GPL |
| 28 | +#endif |
| 29 | + |
| 30 | /* Align . to a 8 byte boundary equals to maximum function alignment. */ |
| 31 | #define ALIGN_FUNCTION() . = ALIGN(8) |
| 32 | |
| 33 | @@ -408,14 +418,14 @@ |
| 34 | /* Kernel symbol table: Normal symbols */ \ |
| 35 | __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \ |
| 36 | __start___ksymtab = .; \ |
| 37 | - KEEP(*(SORT(___ksymtab+*))) \ |
| 38 | + SYMTAB_KEEP \ |
| 39 | __stop___ksymtab = .; \ |
| 40 | } \ |
| 41 | \ |
| 42 | /* Kernel symbol table: GPL-only symbols */ \ |
| 43 | __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \ |
| 44 | __start___ksymtab_gpl = .; \ |
| 45 | - KEEP(*(SORT(___ksymtab_gpl+*))) \ |
| 46 | + SYMTAB_KEEP_GPL \ |
| 47 | __stop___ksymtab_gpl = .; \ |
| 48 | } \ |
| 49 | \ |
| 50 | @@ -477,7 +487,7 @@ |
| 51 | \ |
| 52 | /* Kernel symbol table: strings */ \ |
| 53 | __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \ |
| 54 | - *(__ksymtab_strings) \ |
| 55 | + *(__ksymtab_strings+*) \ |
| 56 | } \ |
| 57 | \ |
| 58 | /* __*init sections */ \ |
| 59 | @@ -917,6 +927,8 @@ |
| 60 | /DISCARD/ : { \ |
| 61 | EXIT_DISCARDS \ |
| 62 | EXIT_CALL \ |
| 63 | + SYMTAB_DISCARD \ |
| 64 | + SYMTAB_DISCARD_GPL \ |
| 65 | *(.discard) \ |
| 66 | *(.discard.*) \ |
| 67 | *(.modinfo) \ |
| 68 | --- a/include/linux/export.h |
| 69 | +++ b/include/linux/export.h |
| 70 | @@ -98,18 +98,26 @@ struct kernel_symbol { |
| 71 | |
| 72 | #else |
| 73 | |
| 74 | +#ifdef MODULE |
| 75 | +#define __EXPORT_SUFFIX(sym) |
| 76 | +#else |
| 77 | +#define __EXPORT_SUFFIX(sym) "+" #sym |
| 78 | +#endif |
| 79 | + |
| 80 | #define ___export_symbol_common(sym, sec) \ |
| 81 | extern typeof(sym) sym; \ |
| 82 | __CRC_SYMBOL(sym, sec); \ |
| 83 | static const char __kstrtab_##sym[] \ |
| 84 | - __attribute__((section("__ksymtab_strings"), used, aligned(1))) \ |
| 85 | + __attribute__((section("__ksymtab_strings" \ |
| 86 | + __EXPORT_SUFFIX(sym)), used, aligned(1))) \ |
| 87 | = #sym \ |
| 88 | |
| 89 | /* For every exported symbol, place a struct in the __ksymtab section */ |
| 90 | #define ___EXPORT_SYMBOL_NS(sym, sec, ns) \ |
| 91 | ___export_symbol_common(sym, sec); \ |
| 92 | static const char __kstrtabns_##sym[] \ |
| 93 | - __attribute__((section("__ksymtab_strings"), used, aligned(1))) \ |
| 94 | + __attribute__((section("__ksymtab_strings" \ |
| 95 | + __EXPORT_SUFFIX(sym)), used, aligned(1))) \ |
| 96 | = #ns; \ |
| 97 | __KSYMTAB_ENTRY_NS(sym, sec) |
| 98 | |
| 99 | --- a/scripts/Makefile.build |
| 100 | +++ b/scripts/Makefile.build |
| 101 | @@ -350,7 +350,7 @@ targets += $(extra-y) $(MAKECMDGOALS) $( |
| 102 | # Linker scripts preprocessor (.lds.S -> .lds) |
| 103 | # --------------------------------------------------------------------------- |
| 104 | quiet_cmd_cpp_lds_S = LDS $@ |
| 105 | - cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -U$(ARCH) \ |
| 106 | + cmd_cpp_lds_S = $(CPP) $(EXTRA_LDSFLAGS) $(cpp_flags) -P -U$(ARCH) \ |
| 107 | -D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $< |
| 108 | |
| 109 | $(obj)/%.lds: $(src)/%.lds.S FORCE |