Messages in this thread | ![/](/images/icornerl.gif) | | Date | Tue, 23 Apr 2024 19:48:22 +0800 | Subject | Re: [PATCH] x86: enable HAVE_LD_DEAD_CODE_DATA_ELIMINATION | From | "liuyuntao (F)" <> |
| |
On 2024/4/23 0:01, Masahiro Yamada wrote: > On Mon, Apr 22, 2024 at 3:41 PM Yuntao Liu <liuyuntao12@huawei.com> wrote: >> >> The current x86 architecture does not yet support the >> HAVE_LD_DEAD_CODE_DATA_ELIMINATION feature. x86 is widely used in >> embedded scenarios, and enabling this feature would be beneficial for >> reducing the size of the kernel image. >> >> In order to make this work, we keep the necessary tables by annotating >> them with KEEP, also it requires further changes to linker script to KEEP >> some tables and wildcard compiler generated sections into the right place. >> >> Enabling CONFIG_UNWINDER_ORC or CONFIG_MITIGATION_RETPOLINE will enable >> the objtool's --orc and --retpoline parameters, which will alter the >> layout of the binary file, thereby preventing gc-sections from functioning >> properly. Therefore, HAVE_LD_DEAD_CODE_DATA_ELIMINATION should only be >> selected when they are not enabled. >> >> Enabling CONFIG_LTO_CLANG or CONFIG_X86_KERNEL_IBT will use vmlinux.o >> instead of performing the slow LTO link again. This can also prevent >> gc-sections from functioning properly. Therefore, using this optimization >> when CONFIG_LD_DEAD_CODE_DATA_ELIMINATION is not enabled. >> >> The size comparison of zImage is as follows: >> x86_def_defconfig i386_defconfig tinyconfig >> 10892288 10826240 607232 no dce >> 10748928 10719744 529408 dce >> 1.3% 0.98% 12.8% shrink >> >> When using smaller config file, there is a significant reduction in the >> size of the zImage. >> --- > >> diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh >> index 7862a8101747..7287b5a9f17d 100755 >> --- a/scripts/link-vmlinux.sh >> +++ b/scripts/link-vmlinux.sh >> @@ -60,7 +60,7 @@ vmlinux_link() >> # skip output file argument >> shift >> >> - if is_enabled CONFIG_LTO_CLANG || is_enabled CONFIG_X86_KERNEL_IBT; then >> + if [ is_enabled CONFIG_LTO_CLANG || is_enabled CONFIG_X86_KERNEL_IBT ] && [ ! is_enabled CONFIG_LD_DEAD_CODE_DATA_ELIMINATION ]; then >> # Use vmlinux.o instead of performing the slow LTO link again. >> objs=vmlinux.o >> libs= >> -- > > > This is wrong. > You should not put is_enabled inside [ ... ] >
My mistake.
> (is_enabled CONFIG_LTO_CLANG || is_enabled CONFIG_X86_KERNEL_IBT) && ! > is_enabled CONFIG_LD_DEAD_CODE_DATA_ELIMINATION > > is still weird. > > > When CONFIG_LTO_CLANG=y and CONFIG_LD_DEAD_CODE_DATA_ELIMINATION=y, > the result of LTO will be discarded. >
On arm and risc-v, these two configs can both be enabled without any issues, i think, it should be the same for x86 as well.
| ![\](/images/icornerr.gif) |