27eb5ffcb7
With CONFIG_LTO_CLANG_FULL, LLVM drops all CFI jump table symbols from vmlinux, which doesn't affect kernel functionality, but can make stack traces and other kernel output that prints out jump table addresses harder to read. This change works around the issue for now by adding a script that tells kallsyms about the missing jump table symbols, even though they don't actually exist in the symbol table, and generates a linker script to add the missing symbols to kernel modules. Bug: 186152035 Bug: 187415564 Change-Id: Ic3c51751c756f2f5fb2a31229e16c3397eb6e666 Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
99 lines
2.9 KiB
Makefile
99 lines
2.9 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 objtool_args
|
|
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)
|
|
|
|
ifdef CONFIG_LTO_CLANG
|
|
# With CONFIG_LTO_CLANG, reuse the object file we compiled for modpost to
|
|
# avoid a second slow LTO link
|
|
prelink-ext := .lto
|
|
|
|
# ELF processing was skipped earlier because we didn't have native code,
|
|
# so let's now process the prelinked binary before we link the module.
|
|
|
|
ifdef CONFIG_STACK_VALIDATION
|
|
ifneq ($(SKIP_STACK_VALIDATION),1)
|
|
cmd_ld_ko_o += \
|
|
$(objtree)/tools/objtool/objtool $(objtool_args) \
|
|
$(@:.ko=$(prelink-ext).o);
|
|
|
|
endif # SKIP_STACK_VALIDATION
|
|
endif # CONFIG_STACK_VALIDATION
|
|
|
|
endif # CONFIG_LTO_CLANG
|
|
|
|
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: %$(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)
|