mirror of
https://github.com/hardkernel/linux.git
synced 2026-03-25 12:00:22 +09:00
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 <alobakin@pm.me>
Tested-by: Alexander Lobakin <alobakin@pm.me>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
(cherry picked from commit 850ded46c6)
Conflicts:
scripts/Makefile.modfinal
scripts/Makefile.modpost
Bug: 189327973
Change-Id: I61c3782619e6475cfff74c270b70e01e229dc8df
Signed-off-by: Eric Biggers <ebiggers@google.com>
80 lines
2.4 KiB
Makefile
80 lines
2.4 KiB
Makefile
# SPDX-License-Identifier: GPL-2.0-only
|
|
# ===========================================================================
|
|
# Module final link
|
|
# ===========================================================================
|
|
|
|
PHONY := __modfinal
|
|
__modfinal:
|
|
|
|
include $(objtree)/include/config/auto.conf
|
|
include $(srctree)/scripts/Kbuild.include
|
|
|
|
# for c_flags and mod-prelink-ext
|
|
include $(srctree)/scripts/Makefile.lib
|
|
|
|
# find all modules listed in modules.order
|
|
modules := $(sort $(shell cat $(MODORDER)))
|
|
|
|
__modfinal: $(modules)
|
|
@:
|
|
|
|
# modname and part-of-module are set to make c_flags define proper module flags
|
|
modname = $(notdir $(@:.mod.o=))
|
|
part-of-module = y
|
|
|
|
quiet_cmd_cc_o_c = CC [M] $@
|
|
cmd_cc_o_c = \
|
|
$(CC) $(filter-out $(CC_FLAGS_CFI) $(CC_FLAGS_FTRACE), \
|
|
$(c_flags)) -c -o $@ $<
|
|
|
|
%.mod.o: %.mod.c FORCE
|
|
$(call if_changed_dep,cc_o_c)
|
|
|
|
ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(SRCARCH)/Makefile.postlink)
|
|
|
|
quiet_cmd_ld_ko_o = LD [M] $@
|
|
cmd_ld_ko_o += \
|
|
$(LD) -r $(KBUILD_LDFLAGS) \
|
|
$(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE) \
|
|
-T scripts/module.lds -o $@ $(filter %.o, $^); \
|
|
$(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)
|
|
|
|
ifdef CONFIG_CFI_CLANG
|
|
# LLVM can drops jump table symbols from the final binary. Add them
|
|
# back to make stack traces and other symbol output readable.
|
|
cmd_ld_ko_o += ; \
|
|
$(srctree)/scripts/generate_cfi_kallsyms.pl --module \
|
|
$@ > $(@:.ko=.lds); \
|
|
if [ -s $(@:.ko=.lds) ]; then \
|
|
$(LD) -r $(KBUILD_LDFLAGS) \
|
|
$(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE) \
|
|
-T $(@:.ko=.lds) \
|
|
-o $(@:.ko=.tmp.ko) $@; \
|
|
mv -f $(@:.ko=.tmp.ko) $@; \
|
|
else \
|
|
rm -f $(@:.ko=.lds); \
|
|
fi
|
|
endif
|
|
|
|
$(modules): %.ko: %$(mod-prelink-ext).o %.mod.o scripts/module.lds FORCE
|
|
+$(call if_changed,ld_ko_o)
|
|
|
|
targets += $(modules) $(modules:.ko=.mod.o)
|
|
|
|
# Add FORCE to the prequisites of a target to force it to be always rebuilt.
|
|
# ---------------------------------------------------------------------------
|
|
|
|
PHONY += FORCE
|
|
FORCE:
|
|
|
|
# Read all saved command lines and dependencies for the $(targets) we
|
|
# may be building above, using $(if_changed{,_dep}). As an
|
|
# optimization, we don't need to read them if the target does not
|
|
# exist, we will rebuild anyway in that case.
|
|
|
|
existing-targets := $(wildcard $(sort $(targets)))
|
|
|
|
-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd)
|
|
|
|
.PHONY: $(PHONY)
|