diff options
| author | Masahiro Yamada <yamada.masahiro@socionext.com> | 2018-11-29 20:05:26 -0500 |
|---|---|---|
| committer | Masahiro Yamada <yamada.masahiro@socionext.com> | 2018-12-01 09:13:14 -0500 |
| commit | bbda5ec671d3fe62faefa1cab7270aa586042a4b (patch) | |
| tree | a1d375f74ad25efd2797bffaadfb0dc5fc1f65fe /include | |
| parent | ee3e46b7efd2954479f87030d31fda3c22bbc763 (diff) | |
kbuild: simplify dependency generation for CONFIG_TRIM_UNUSED_KSYMS
My main motivation of this commit is to clean up scripts/Kbuild.include
and scripts/Makefile.build.
Currently, CONFIG_TRIM_UNUSED_KSYMS works with a tricky gimmick;
possibly exported symbols are detected by letting $(CPP) replace
EXPORT_SYMBOL* with a special string '=== __KSYM_*===', which is
post-processed by sed, and passed to fixdep. The extra preprocessing
is costly, and hacking cmd_and_fixdep is ugly.
I came up with a new way to find exported symbols; insert a dummy
symbol __ksym_marker_* to each potentially exported symbol. Those
dummy symbols are picked up by $(NM), post-processed by sed, then
appended to .*.cmd files. I collected the post-process part to a
new shell script scripts/gen_ksymdeps.sh for readability. The dummy
symbols are put into the .discard.* section so that the linker
script rips them off the final vmlinux or modules.
A nice side-effect is building with CONFIG_TRIM_UNUSED_KSYMS will
be much faster.
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Reviewed-by: Nicolas Pitre <nico@linaro.org>
Diffstat (limited to 'include')
| -rw-r--r-- | include/asm-generic/export.h | 13 | ||||
| -rw-r--r-- | include/linux/export.h | 18 |
2 files changed, 17 insertions, 14 deletions
diff --git a/include/asm-generic/export.h b/include/asm-generic/export.h index 4d73e6e3c66c..294d6ae785d4 100644 --- a/include/asm-generic/export.h +++ b/include/asm-generic/export.h | |||
| @@ -59,16 +59,19 @@ __kcrctab_\name: | |||
| 59 | .endm | 59 | .endm |
| 60 | #undef __put | 60 | #undef __put |
| 61 | 61 | ||
| 62 | #if defined(__KSYM_DEPS__) | 62 | #if defined(CONFIG_TRIM_UNUSED_KSYMS) |
| 63 | |||
| 64 | #define __EXPORT_SYMBOL(sym, val, sec) === __KSYM_##sym === | ||
| 65 | |||
| 66 | #elif defined(CONFIG_TRIM_UNUSED_KSYMS) | ||
| 67 | 63 | ||
| 68 | #include <linux/kconfig.h> | 64 | #include <linux/kconfig.h> |
| 69 | #include <generated/autoksyms.h> | 65 | #include <generated/autoksyms.h> |
| 70 | 66 | ||
| 67 | .macro __ksym_marker sym | ||
| 68 | .section ".discard.ksym","a" | ||
| 69 | __ksym_marker_\sym: | ||
| 70 | .previous | ||
| 71 | .endm | ||
| 72 | |||
| 71 | #define __EXPORT_SYMBOL(sym, val, sec) \ | 73 | #define __EXPORT_SYMBOL(sym, val, sec) \ |
| 74 | __ksym_marker sym; \ | ||
| 72 | __cond_export_sym(sym, val, sec, __is_defined(__KSYM_##sym)) | 75 | __cond_export_sym(sym, val, sec, __is_defined(__KSYM_##sym)) |
| 73 | #define __cond_export_sym(sym, val, sec, conf) \ | 76 | #define __cond_export_sym(sym, val, sec, conf) \ |
| 74 | ___cond_export_sym(sym, val, sec, conf) | 77 | ___cond_export_sym(sym, val, sec, conf) |
diff --git a/include/linux/export.h b/include/linux/export.h index ce764a5d2ee4..fd8711ed9ac4 100644 --- a/include/linux/export.h +++ b/include/linux/export.h | |||
| @@ -92,22 +92,22 @@ struct kernel_symbol { | |||
| 92 | */ | 92 | */ |
| 93 | #define __EXPORT_SYMBOL(sym, sec) | 93 | #define __EXPORT_SYMBOL(sym, sec) |
| 94 | 94 | ||
| 95 | #elif defined(__KSYM_DEPS__) | 95 | #elif defined(CONFIG_TRIM_UNUSED_KSYMS) |
| 96 | |||
| 97 | #include <generated/autoksyms.h> | ||
| 96 | 98 | ||
| 97 | /* | 99 | /* |
| 98 | * For fine grained build dependencies, we want to tell the build system | 100 | * For fine grained build dependencies, we want to tell the build system |
| 99 | * about each possible exported symbol even if they're not actually exported. | 101 | * about each possible exported symbol even if they're not actually exported. |
| 100 | * We use a string pattern that is unlikely to be valid code that the build | 102 | * We use a symbol pattern __ksym_marker_<symbol> that the build system filters |
| 101 | * system filters out from the preprocessor output (see ksym_dep_filter | 103 | * from the $(NM) output (see scripts/gen_ksymdeps.sh). These symbols are |
| 102 | * in scripts/Kbuild.include). | 104 | * discarded in the final link stage. |
| 103 | */ | 105 | */ |
| 104 | #define __EXPORT_SYMBOL(sym, sec) === __KSYM_##sym === | 106 | #define __ksym_marker(sym) \ |
| 105 | 107 | static int __ksym_marker_##sym[0] __section(".discard.ksym") __used | |
| 106 | #elif defined(CONFIG_TRIM_UNUSED_KSYMS) | ||
| 107 | |||
| 108 | #include <generated/autoksyms.h> | ||
| 109 | 108 | ||
| 110 | #define __EXPORT_SYMBOL(sym, sec) \ | 109 | #define __EXPORT_SYMBOL(sym, sec) \ |
| 110 | __ksym_marker(sym); \ | ||
| 111 | __cond_export_sym(sym, sec, __is_defined(__KSYM_##sym)) | 111 | __cond_export_sym(sym, sec, __is_defined(__KSYM_##sym)) |
| 112 | #define __cond_export_sym(sym, sec, conf) \ | 112 | #define __cond_export_sym(sym, sec, conf) \ |
| 113 | ___cond_export_sym(sym, sec, conf) | 113 | ___cond_export_sym(sym, sec, conf) |
