Re: [PATCH v4] kbuild: Fix TRIM_UNUSED_KSYMS with LTO_CLANG
From: Sami Tolvanen <samitolvanen@google.com>
Date: 2021-08-18 15:06:16
Also in:
lkml
On Tue, Aug 17, 2021 at 7:34 PM Masahiro Yamada [off-list ref] wrote:
On Tue, Aug 17, 2021 at 3:05 AM Sami Tolvanen [off-list ref] wrote:quoted
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 v4: - Added .lto.o to targets to actually fix the use of if_changed. - Replaced an unnecessary mod-prelink-ext with .lto. Changes in v3: - Added missing FORCE. Changes in v2: - Fixed a couple of typos. - Fixed objtool arguments for .lto.o to always include --module. --- scripts/Makefile.build | 28 +++++++++++++++++++++++++++- scripts/Makefile.lib | 7 +++++++ scripts/Makefile.modfinal | 21 ++------------------- scripts/Makefile.modpost | 22 +++------------------- scripts/gen_autoksyms.sh | 12 ------------ 5 files changed, 39 insertions(+), 51 deletions(-)diff --git a/scripts/Makefile.build b/scripts/Makefile.build index 02197cb8e3a7..a6f43afd09bb 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build@@ -88,6 +88,10 @@ endif targets-for-modules := $(patsubst %.o, %.mod, $(filter %.o, $(obj-m))) +ifdef CONFIG_LTO_CLANG +targets-for-modules += $(patsubst %.o, %.lto.o, $(filter %.o, $(obj-m))) +endif + ifdef need-modorder targets-for-modules += $(obj)/modules.order endif@@ -271,12 +275,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 $(filter-out FORCE,$^) + +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=.lto.o)What is this "$(@:.ko=.lto.o)" doing ? The target is already suffixed with .lto.o so $(@:.ko=.lto.o) should be the same as $@
Good catch, probably a leftover from an earlier iteration.
Shall I fix it locally unless I find more questionable code?
Please do. Sami