Messages in this thread | | | Date | Fri, 26 Feb 2021 13:13:23 -0800 | From | Fangrui Song <> | Subject | Re: [PATCH] [RFC] arm64: enable HAVE_LD_DEAD_CODE_DATA_ELIMINATION |
| |
On 2021-02-25, Arnd Bergmann wrote: >From: Arnd Bergmann <arnd@arndb.de> > >When looking at kernel size optimizations, I found that arm64 >does not currently support HAVE_LD_DEAD_CODE_DATA_ELIMINATION, >which enables the --gc-sections flag to the linker. > >I see that for a defconfig build with llvm, there are some >notable improvements from enabling this, in particular when >combined with the recently added CONFIG_LTO_CLANG_THIN >and CONFIG_TRIM_UNUSED_KSYMS: > > text data bss dec hex filename >16570322 10998617 506468 28075407 1ac658f defconfig/vmlinux >16318793 10569913 506468 27395174 1a20466 trim_defconfig/vmlinux >16281234 10984848 504291 27770373 1a7be05 gc_defconfig/vmlinux >16029705 10556880 504355 27090940 19d5ffc gc+trim_defconfig/vmlinux >17040142 11102945 504196 28647283 1b51f73 thinlto_defconfig/vmlinux >16788613 10663201 504196 27956010 1aa932a thinlto+trim_defconfig/vmlinux >16347062 11043384 502499 27892945 1a99cd1 gc+thinlto_defconfig/vmlinux >15759453 10532792 502395 26794640 198da90 gc+thinlto+trim_defconfig/vmlinux > >I needed a small change to the linker script to get clean randconfig >builds, but I have not done any meaningful boot testing on it to >see if it works. If there are no regressions, I wonder whether this >should be autmatically done for LTO builds, given that it improves >both kernel size and compile speed. > >Link: https://lore.kernel.org/lkml/CAK8P3a05VZ9hSKRzVTxTn+1nf9E+gqebJWTj6N23nfm+ELHt9A@mail.gmail.com/ >Signed-off-by: Arnd Bergmann <arnd@arndb.de>
For folks who are interested in --gc-sections on metadata sections, I want to bring you awareness of the implication of __start_/__stop_ symbols and C identifier name sections. You can see https://github.com/ClangBuiltLinux/linux/issues/1307 for a summary. (Its linked blog article has some examples.)
In the kernel linker scripts, most C identifier name sections begin with double-underscore __. Some are surrounded by `KEEP(...)`, some are not.
* A `KEEP` keyword has GC root semantics and makes ld --gc-sections ineffectful. * Without `KEEP`, __start_/__stop_ references from a live input section can unnecessarily retain all the associated C identifier name input sections. The new ld.lld option `-z start-stop-gc` can defeat this rule.
As an example, a __start___jump_table reference from a live section causes all `__jump_table` input section to be retained, even if you change `KEEP(__jump_table)` to `(__jump_table)`. (If you change the symbol name from `__start_${section}` to something else (e.g. `__start${section}`), the rule will not apply.)
There are a lot of KEEP usage. Perhaps some can be dropped to facilitate ld --gc-sections.
| |