mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-01 10:13:58 +08:00
kbuild: lto: postpone objtool
With LTO, LLVM bitcode won't be compiled into native code until modpost_link, or modfinal for modules. This change postpones calls to objtool until after these steps, and moves objtool_args to Makefile.lib, so the arguments can be reused in Makefile.modfinal. As we didn't have objects to process earlier, we use --duplicate when processing vmlinux.o. This change also disables unreachable instruction warnings with LTO to avoid warnings about the int3 padding between functions. Signed-off-by: Sami Tolvanen <samitolvanen@google.com> Reviewed-by: Kees Cook <keescook@chromium.org>
This commit is contained in:
parent
41425ebe20
commit
b1a1a1a09b
@ -218,30 +218,11 @@ cmd_record_mcount = $(if $(findstring $(strip $(CC_FLAGS_FTRACE)),$(_c_flags)),
|
|||||||
endif # CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT
|
endif # CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT
|
||||||
|
|
||||||
ifdef CONFIG_STACK_VALIDATION
|
ifdef CONFIG_STACK_VALIDATION
|
||||||
|
ifndef CONFIG_LTO_CLANG
|
||||||
ifneq ($(SKIP_STACK_VALIDATION),1)
|
ifneq ($(SKIP_STACK_VALIDATION),1)
|
||||||
|
|
||||||
__objtool_obj := $(objtree)/tools/objtool/objtool
|
__objtool_obj := $(objtree)/tools/objtool/objtool
|
||||||
|
|
||||||
objtool_args = $(if $(CONFIG_UNWINDER_ORC),orc generate,check)
|
|
||||||
|
|
||||||
objtool_args += $(if $(part-of-module), --module,)
|
|
||||||
|
|
||||||
ifndef CONFIG_FRAME_POINTER
|
|
||||||
objtool_args += --no-fp
|
|
||||||
endif
|
|
||||||
ifdef CONFIG_GCOV_KERNEL
|
|
||||||
objtool_args += --no-unreachable
|
|
||||||
endif
|
|
||||||
ifdef CONFIG_RETPOLINE
|
|
||||||
objtool_args += --retpoline
|
|
||||||
endif
|
|
||||||
ifdef CONFIG_X86_SMAP
|
|
||||||
objtool_args += --uaccess
|
|
||||||
endif
|
|
||||||
ifdef CONFIG_FTRACE_MCOUNT_USE_OBJTOOL
|
|
||||||
objtool_args += --mcount
|
|
||||||
endif
|
|
||||||
|
|
||||||
# 'OBJECT_FILES_NON_STANDARD := y': skip objtool checking for a directory
|
# 'OBJECT_FILES_NON_STANDARD := y': skip objtool checking for a directory
|
||||||
# 'OBJECT_FILES_NON_STANDARD_foo.o := 'y': skip objtool checking for a file
|
# 'OBJECT_FILES_NON_STANDARD_foo.o := 'y': skip objtool checking for a file
|
||||||
# 'OBJECT_FILES_NON_STANDARD_foo.o := 'n': override directory skip for a file
|
# 'OBJECT_FILES_NON_STANDARD_foo.o := 'n': override directory skip for a file
|
||||||
@ -253,6 +234,7 @@ objtool_obj = $(if $(patsubst y%,, \
|
|||||||
$(__objtool_obj))
|
$(__objtool_obj))
|
||||||
|
|
||||||
endif # SKIP_STACK_VALIDATION
|
endif # SKIP_STACK_VALIDATION
|
||||||
|
endif # CONFIG_LTO_CLANG
|
||||||
endif # CONFIG_STACK_VALIDATION
|
endif # CONFIG_STACK_VALIDATION
|
||||||
|
|
||||||
# Rebuild all objects when objtool changes, or is enabled/disabled.
|
# Rebuild all objects when objtool changes, or is enabled/disabled.
|
||||||
|
@ -220,6 +220,18 @@ dtc_cpp_flags = -Wp,-MMD,$(depfile).pre.tmp -nostdinc \
|
|||||||
$(addprefix -I,$(DTC_INCLUDE)) \
|
$(addprefix -I,$(DTC_INCLUDE)) \
|
||||||
-undef -D__DTS__
|
-undef -D__DTS__
|
||||||
|
|
||||||
|
# Objtool arguments are also needed for modfinal with LTO, so we define
|
||||||
|
# then here to avoid duplication.
|
||||||
|
objtool_args = \
|
||||||
|
$(if $(CONFIG_UNWINDER_ORC),orc generate,check) \
|
||||||
|
$(if $(part-of-module), --module,) \
|
||||||
|
$(if $(CONFIG_FRAME_POINTER),, --no-fp) \
|
||||||
|
$(if $(or $(CONFIG_GCOV_KERNEL),$(CONFIG_LTO_CLANG)), \
|
||||||
|
--no-unreachable,) \
|
||||||
|
$(if $(CONFIG_RETPOLINE), --retpoline,) \
|
||||||
|
$(if $(CONFIG_X86_SMAP), --uaccess,) \
|
||||||
|
$(if $(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL), --mcount,)
|
||||||
|
|
||||||
# Useful for describing the dependency of composite objects
|
# Useful for describing the dependency of composite objects
|
||||||
# Usage:
|
# Usage:
|
||||||
# $(call multi_depend, multi_used_targets, suffix_to_remove, suffix_to_add)
|
# $(call multi_depend, multi_used_targets, suffix_to_remove, suffix_to_add)
|
||||||
|
@ -9,7 +9,7 @@ __modfinal:
|
|||||||
include include/config/auto.conf
|
include include/config/auto.conf
|
||||||
include $(srctree)/scripts/Kbuild.include
|
include $(srctree)/scripts/Kbuild.include
|
||||||
|
|
||||||
# for c_flags
|
# for c_flags and objtool_args
|
||||||
include $(srctree)/scripts/Makefile.lib
|
include $(srctree)/scripts/Makefile.lib
|
||||||
|
|
||||||
# find all modules listed in modules.order
|
# find all modules listed in modules.order
|
||||||
@ -34,10 +34,23 @@ ifdef CONFIG_LTO_CLANG
|
|||||||
# With CONFIG_LTO_CLANG, reuse the object file we compiled for modpost to
|
# With CONFIG_LTO_CLANG, reuse the object file we compiled for modpost to
|
||||||
# avoid a second slow LTO link
|
# avoid a second slow LTO link
|
||||||
prelink-ext := .lto
|
prelink-ext := .lto
|
||||||
endif
|
|
||||||
|
# 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] $@
|
quiet_cmd_ld_ko_o = LD [M] $@
|
||||||
cmd_ld_ko_o = \
|
cmd_ld_ko_o += \
|
||||||
$(LD) -r $(KBUILD_LDFLAGS) \
|
$(LD) -r $(KBUILD_LDFLAGS) \
|
||||||
$(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE) \
|
$(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE) \
|
||||||
-T scripts/module.lds -o $@ $(filter %.o, $^); \
|
-T scripts/module.lds -o $@ $(filter %.o, $^); \
|
||||||
|
@ -103,14 +103,36 @@ modpost_link()
|
|||||||
|
|
||||||
objtool_link()
|
objtool_link()
|
||||||
{
|
{
|
||||||
|
local objtoolcmd;
|
||||||
local objtoolopt;
|
local objtoolopt;
|
||||||
|
|
||||||
|
if [ "${CONFIG_LTO_CLANG} ${CONFIG_STACK_VALIDATION}" = "y y" ]; then
|
||||||
|
# Don't perform vmlinux validation unless explicitly requested,
|
||||||
|
# but run objtool on vmlinux.o now that we have an object file.
|
||||||
|
if [ -n "${CONFIG_UNWINDER_ORC}" ]; then
|
||||||
|
objtoolcmd="orc generate"
|
||||||
|
fi
|
||||||
|
|
||||||
|
objtoolopt="${objtoolopt} --duplicate"
|
||||||
|
|
||||||
|
if [ -n "${CONFIG_FTRACE_MCOUNT_USE_OBJTOOL}" ]; then
|
||||||
|
objtoolopt="${objtoolopt} --mcount"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -n "${CONFIG_VMLINUX_VALIDATION}" ]; then
|
if [ -n "${CONFIG_VMLINUX_VALIDATION}" ]; then
|
||||||
objtoolopt="check --vmlinux --noinstr"
|
objtoolopt="${objtoolopt} --noinstr"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "${objtoolopt}" ]; then
|
||||||
|
if [ -z "${objtoolcmd}" ]; then
|
||||||
|
objtoolcmd="check"
|
||||||
|
fi
|
||||||
|
objtoolopt="${objtoolopt} --vmlinux"
|
||||||
if [ -z "${CONFIG_FRAME_POINTER}" ]; then
|
if [ -z "${CONFIG_FRAME_POINTER}" ]; then
|
||||||
objtoolopt="${objtoolopt} --no-fp"
|
objtoolopt="${objtoolopt} --no-fp"
|
||||||
fi
|
fi
|
||||||
if [ -n "${CONFIG_GCOV_KERNEL}" ]; then
|
if [ -n "${CONFIG_GCOV_KERNEL}" ] || [ -n "${CONFIG_LTO_CLANG}" ]; then
|
||||||
objtoolopt="${objtoolopt} --no-unreachable"
|
objtoolopt="${objtoolopt} --no-unreachable"
|
||||||
fi
|
fi
|
||||||
if [ -n "${CONFIG_RETPOLINE}" ]; then
|
if [ -n "${CONFIG_RETPOLINE}" ]; then
|
||||||
@ -120,7 +142,7 @@ objtool_link()
|
|||||||
objtoolopt="${objtoolopt} --uaccess"
|
objtoolopt="${objtoolopt} --uaccess"
|
||||||
fi
|
fi
|
||||||
info OBJTOOL ${1}
|
info OBJTOOL ${1}
|
||||||
tools/objtool/objtool ${objtoolopt} ${1}
|
tools/objtool/objtool ${objtoolcmd} ${objtoolopt} ${1}
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user