Re: [PATCH RESEND v2] kbuild: Fix TRIM_UNUSED_KSYMS with LTO_CLANG
From: Masahiro Yamada <masahiroy@kernel.org>
Date: 2021-08-12 20:02:41
Also in:
lkml
On Thu, Aug 12, 2021 at 5:30 AM Sami Tolvanen [off-list ref] wrote:
quoted hunk ↗ jump to hunk
With CONFIG_LTO_CLANG, we currently link modules into native code just before modpost, which means with TRIM_UNUSED_KSYMS enabled, we still look at the LLVM bitcode in the .o files when generating the list of used symbols. As the bitcode doesn't yet have calls to compiler intrinsics and llvm-nm doesn't see function references that only exist in function-level inline assembly, we currently need a whitelist for TRIM_UNUSED_KSYMS to work with LTO. This change moves module LTO linking to happen earlier, and thus avoids the issue with LLVM bitcode and TRIM_UNUSED_KSYMS entirely, allowing us to also drop the whitelist from gen_autoksyms.sh. Link: https://github.com/ClangBuiltLinux/linux/issues/1369 Signed-off-by: Sami Tolvanen <samitolvanen@google.com> Reviewed-by: Alexander Lobakin <redacted> Tested-by: Alexander Lobakin <redacted> --- Changes in v2: - Fixed a couple of typos. - Fixed objtool arguments for .lto.o to always include --module. --- scripts/Makefile.build | 24 +++++++++++++++++++++++- scripts/Makefile.lib | 7 +++++++ scripts/Makefile.modfinal | 21 ++------------------- scripts/Makefile.modpost | 22 +++------------------- scripts/gen_autoksyms.sh | 12 ------------ 5 files changed, 35 insertions(+), 51 deletions(-)diff --git a/scripts/Makefile.build b/scripts/Makefile.build index 02197cb8e3a7..778dabea3a89 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build@@ -271,12 +271,34 @@ $(obj)/%.o: $(src)/%.c $(recordmcount_source) $$(objtool_dep) FORCE $(call if_changed_rule,cc_o_c) $(call cmd,force_checksrc) +ifdef CONFIG_LTO_CLANG +# Module .o files may contain LLVM bitcode, compile them into native code +# before ELF processing +quiet_cmd_cc_lto_link_modules = LTO [M] $@ +cmd_cc_lto_link_modules = \ + $(LD) $(ld_flags) -r -o $@ \ + $(shell [ -s $(@:.lto.o=.o.symversions) ] && \ + echo -T $(@:.lto.o=.o.symversions)) \ + --whole-archive $^ + +ifdef CONFIG_STACK_VALIDATION +# objtool was skipped for LLVM bitcode, run it now that we have compiled +# modules into native code +cmd_cc_lto_link_modules += ; \ + $(objtree)/tools/objtool/objtool $(objtool_args) --module \ + $(@:.ko=$(mod-prelink-ext).o) +endif + +$(obj)/%.lto.o: $(obj)/%.o + $(call if_changed,cc_lto_link_modules)
Documentation/kbuild/makefiles.rst says:
Note: It is a typical mistake to forget the FORCE prerequisite.
The current code in scripts/Makefile.modpost is also wrong, though.
--
Best Regards
Masahiro Yamada