Kbuild updates for v4.18 (2nd)
- fix some bugs introduced by the recent Kconfig syntax extension - add some symbols about compiler information in Kconfig, such as CC_IS_GCC, CC_IS_CLANG, GCC_VERSION, etc. - test compiler capability for the stack protector in Kconfig, and clean-up Makefile - test compiler capability for GCC-plugins in Kconfig, and clean-up Makefile - allow to enable GCC-plugins for COMPILE_TEST - test compiler capability for KCOV in Kconfig and correct dependency - remove auto-detect mode of the GCOV format, which is now more nicely handled in Kconfig - test compiler capability for mprofile-kernel on PowerPC, and clean-up Makefile - misc cleanups -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJbISvEAAoJED2LAQed4NsGEsoQAKBHMqUM9yQo0LdVMnDMCLQI Xsjyqzr0ySp6YiuF+cobwDs49sggt7/8EX+OnrP/sLlAhY0QrNGI1ulhwpFx1Ewa xFxz5kF/1jDwC+AjngXcK5Dr9nGSSMfT3wQhLGKjMkKSypbz2QyTrfMOfHGYSzU1 gD8RMWYXxKoJFmIaqmpLz7PDfWKPzhSOZo7BflPjAGXdlpfSV9cQvu+TkJ12qvSp KZ2uHUgLz95NnltSuGtN71X8so7w4eTYAvkJ5bOeOpYsZSVYRq4Exvwe0Y0dbwie WDpcRC5KrQOlIFxRUUSGn5cDsaW9yYJJAwMG6Dr8qJ66QlgY5GqOKXxXX+ARa7WU 7GkeAZ11n5dArjjdSjfClh8CwDiZNpJmAUbahm+feQfUfq9nbs+0JX6bOG5ZE+nt 3iE0ZoSGDjxD5Pjy4u+NtQM0JCpieuz3JNxqVbAVm0Ua5q8niwSEneixyrNmjkBF 1tV+qsMYus7AFwdGuDRXzBhVY7hd931H34czA3FUZZqwcClFVoJiygI++s62mVXx w9kYi8Ades/W6dt7c7XGjmqYTDgnTolLaYY5vggpEeLOzc1QPW6iKt9tpREi6Zzm n+y586YsIo0vjTMfRcfmGZUPG3CJeqL2UDslYmG8PgMQ6/eaAHBDXECLrAkGGPlG aIPZcMam5BQxhmSJc19c =VABv -----END PGP SIGNATURE----- Merge tag 'kbuild-v4.18-2' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild Pull more Kbuild updates from Masahiro Yamada: - fix some bugs introduced by the recent Kconfig syntax extension - add some symbols about compiler information in Kconfig, such as CC_IS_GCC, CC_IS_CLANG, GCC_VERSION, etc. - test compiler capability for the stack protector in Kconfig, and clean-up Makefile - test compiler capability for GCC-plugins in Kconfig, and clean-up Makefile - allow to enable GCC-plugins for COMPILE_TEST - test compiler capability for KCOV in Kconfig and correct dependency - remove auto-detect mode of the GCOV format, which is now more nicely handled in Kconfig - test compiler capability for mprofile-kernel on PowerPC, and clean-up Makefile - misc cleanups * tag 'kbuild-v4.18-2' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild: linux/linkage.h: replace VMLINUX_SYMBOL_STR() with __stringify() kconfig: fix localmodconfig sh: remove no-op macro VMLINUX_SYMBOL() powerpc/kbuild: move -mprofile-kernel check to Kconfig Documentation: kconfig: add recommended way to describe compiler support gcc-plugins: disable GCC_PLUGIN_STRUCTLEAK_BYREF_ALL for COMPILE_TEST gcc-plugins: allow to enable GCC_PLUGINS for COMPILE_TEST gcc-plugins: test plugin support in Kconfig and clean up Makefile gcc-plugins: move GCC version check for PowerPC to Kconfig kcov: test compiler capability in Kconfig and correct dependency gcov: remove CONFIG_GCOV_FORMAT_AUTODETECT arm64: move GCC version check for ARCH_SUPPORTS_INT128 to Kconfig kconfig: add CC_IS_CLANG and CLANG_VERSION kconfig: add CC_IS_GCC and GCC_VERSION stack-protector: test compiler capability in Kconfig and drop AUTO mode kbuild: fix endless syncconfig in case arch Makefile sets CROSS_COMPILE
This commit is contained in:
commit
be779f03d5
|
@ -473,6 +473,24 @@ config option to 'y' no matter the dependencies.
|
||||||
The dependencies are moved to the symbol GENERIC_IOMAP and we avoid the
|
The dependencies are moved to the symbol GENERIC_IOMAP and we avoid the
|
||||||
situation where select forces a symbol equals to 'y'.
|
situation where select forces a symbol equals to 'y'.
|
||||||
|
|
||||||
|
Adding features that need compiler support
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
There are several features that need compiler support. The recommended way
|
||||||
|
to describe the dependency on the compiler feature is to use "depends on"
|
||||||
|
followed by a test macro.
|
||||||
|
|
||||||
|
config CC_STACKPROTECTOR
|
||||||
|
bool "Stack Protector buffer overflow detection"
|
||||||
|
depends on $(cc-option,-fstack-protector)
|
||||||
|
...
|
||||||
|
|
||||||
|
If you need to expose a compiler capability to makefiles and/or C source files,
|
||||||
|
CC_HAS_ is the recommended prefix for the config option.
|
||||||
|
|
||||||
|
config CC_HAS_STACKPROTECTOR_NONE
|
||||||
|
def_bool $(cc-option,-fno-stack-protector)
|
||||||
|
|
||||||
Build as module only
|
Build as module only
|
||||||
~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~
|
||||||
To restrict a component build to module-only, qualify its config symbol
|
To restrict a component build to module-only, qualify its config symbol
|
||||||
|
|
147
Makefile
147
Makefile
|
@ -442,8 +442,6 @@ export KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE KBUILD_LDFLAGS_MODULE
|
||||||
export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL
|
export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL
|
||||||
export KBUILD_ARFLAGS
|
export KBUILD_ARFLAGS
|
||||||
|
|
||||||
export CC_VERSION_TEXT := $(shell $(CC) --version | head -n 1)
|
|
||||||
|
|
||||||
# When compiling out-of-tree modules, put MODVERDIR in the module
|
# When compiling out-of-tree modules, put MODVERDIR in the module
|
||||||
# tree rather than in the kernel tree. The kernel tree might
|
# tree rather than in the kernel tree. The kernel tree might
|
||||||
# even be read-only.
|
# even be read-only.
|
||||||
|
@ -514,6 +512,12 @@ ifeq ($(shell $(CONFIG_SHELL) $(srctree)/scripts/cc-can-link.sh $(CC)), y)
|
||||||
export CC_CAN_LINK
|
export CC_CAN_LINK
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# The expansion should be delayed until arch/$(SRCARCH)/Makefile is included.
|
||||||
|
# Some architectures define CROSS_COMPILE in arch/$(SRCARCH)/Makefile.
|
||||||
|
# CC_VERSION_TEXT is referenced from Kconfig (so it needs export),
|
||||||
|
# and from include/config/auto.conf.cmd to detect the compiler upgrade.
|
||||||
|
CC_VERSION_TEXT = $(shell $(CC) --version | head -n 1)
|
||||||
|
|
||||||
ifeq ($(config-targets),1)
|
ifeq ($(config-targets),1)
|
||||||
# ===========================================================================
|
# ===========================================================================
|
||||||
# *config targets only - make sure prerequisites are updated, and descend
|
# *config targets only - make sure prerequisites are updated, and descend
|
||||||
|
@ -523,7 +527,7 @@ ifeq ($(config-targets),1)
|
||||||
# KBUILD_DEFCONFIG may point out an alternative default configuration
|
# KBUILD_DEFCONFIG may point out an alternative default configuration
|
||||||
# used for 'make defconfig'
|
# used for 'make defconfig'
|
||||||
include arch/$(SRCARCH)/Makefile
|
include arch/$(SRCARCH)/Makefile
|
||||||
export KBUILD_DEFCONFIG KBUILD_KCONFIG
|
export KBUILD_DEFCONFIG KBUILD_KCONFIG CC_VERSION_TEXT
|
||||||
|
|
||||||
config: scripts_basic outputmakefile FORCE
|
config: scripts_basic outputmakefile FORCE
|
||||||
$(Q)$(MAKE) $(build)=scripts/kconfig $@
|
$(Q)$(MAKE) $(build)=scripts/kconfig $@
|
||||||
|
@ -585,12 +589,32 @@ virt-y := virt/
|
||||||
endif # KBUILD_EXTMOD
|
endif # KBUILD_EXTMOD
|
||||||
|
|
||||||
ifeq ($(dot-config),1)
|
ifeq ($(dot-config),1)
|
||||||
# Read in config
|
|
||||||
-include include/config/auto.conf
|
-include include/config/auto.conf
|
||||||
|
endif
|
||||||
|
|
||||||
|
# The all: target is the default when no target is given on the
|
||||||
|
# command line.
|
||||||
|
# This allow a user to issue only 'make' to build a kernel including modules
|
||||||
|
# Defaults to vmlinux, but the arch makefile usually adds further targets
|
||||||
|
all: vmlinux
|
||||||
|
|
||||||
|
CFLAGS_GCOV := -fprofile-arcs -ftest-coverage \
|
||||||
|
$(call cc-option,-fno-tree-loop-im) \
|
||||||
|
$(call cc-disable-warning,maybe-uninitialized,)
|
||||||
|
export CFLAGS_GCOV
|
||||||
|
|
||||||
|
# The arch Makefile can set ARCH_{CPP,A,C}FLAGS to override the default
|
||||||
|
# values of the respective KBUILD_* variables
|
||||||
|
ARCH_CPPFLAGS :=
|
||||||
|
ARCH_AFLAGS :=
|
||||||
|
ARCH_CFLAGS :=
|
||||||
|
include arch/$(SRCARCH)/Makefile
|
||||||
|
|
||||||
|
ifeq ($(dot-config),1)
|
||||||
ifeq ($(KBUILD_EXTMOD),)
|
ifeq ($(KBUILD_EXTMOD),)
|
||||||
# Read in dependencies to all Kconfig* files, make sure to run
|
# Read in dependencies to all Kconfig* files, make sure to run syncconfig if
|
||||||
# oldconfig if changes are detected.
|
# changes are detected. This should be included after arch/$(SRCARCH)/Makefile
|
||||||
|
# because some architectures define CROSS_COMPILE there.
|
||||||
-include include/config/auto.conf.cmd
|
-include include/config/auto.conf.cmd
|
||||||
|
|
||||||
# To avoid any implicit rule to kick in, define an empty command
|
# To avoid any implicit rule to kick in, define an empty command
|
||||||
|
@ -622,24 +646,6 @@ else
|
||||||
include/config/auto.conf: ;
|
include/config/auto.conf: ;
|
||||||
endif # $(dot-config)
|
endif # $(dot-config)
|
||||||
|
|
||||||
# The all: target is the default when no target is given on the
|
|
||||||
# command line.
|
|
||||||
# This allow a user to issue only 'make' to build a kernel including modules
|
|
||||||
# Defaults to vmlinux, but the arch makefile usually adds further targets
|
|
||||||
all: vmlinux
|
|
||||||
|
|
||||||
CFLAGS_GCOV := -fprofile-arcs -ftest-coverage \
|
|
||||||
$(call cc-option,-fno-tree-loop-im) \
|
|
||||||
$(call cc-disable-warning,maybe-uninitialized,)
|
|
||||||
export CFLAGS_GCOV CFLAGS_KCOV
|
|
||||||
|
|
||||||
# The arch Makefile can set ARCH_{CPP,A,C}FLAGS to override the default
|
|
||||||
# values of the respective KBUILD_* variables
|
|
||||||
ARCH_CPPFLAGS :=
|
|
||||||
ARCH_AFLAGS :=
|
|
||||||
ARCH_CFLAGS :=
|
|
||||||
include arch/$(SRCARCH)/Makefile
|
|
||||||
|
|
||||||
KBUILD_CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks,)
|
KBUILD_CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks,)
|
||||||
KBUILD_CFLAGS += $(call cc-disable-warning,frame-address,)
|
KBUILD_CFLAGS += $(call cc-disable-warning,frame-address,)
|
||||||
KBUILD_CFLAGS += $(call cc-disable-warning, format-truncation)
|
KBUILD_CFLAGS += $(call cc-disable-warning, format-truncation)
|
||||||
|
@ -680,55 +686,11 @@ ifneq ($(CONFIG_FRAME_WARN),0)
|
||||||
KBUILD_CFLAGS += $(call cc-option,-Wframe-larger-than=${CONFIG_FRAME_WARN})
|
KBUILD_CFLAGS += $(call cc-option,-Wframe-larger-than=${CONFIG_FRAME_WARN})
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# This selects the stack protector compiler flag. Testing it is delayed
|
stackp-flags-$(CONFIG_CC_HAS_STACKPROTECTOR_NONE) := -fno-stack-protector
|
||||||
# until after .config has been reprocessed, in the prepare-compiler-check
|
stackp-flags-$(CONFIG_CC_STACKPROTECTOR) := -fstack-protector
|
||||||
# target.
|
stackp-flags-$(CONFIG_CC_STACKPROTECTOR_STRONG) := -fstack-protector-strong
|
||||||
ifdef CONFIG_CC_STACKPROTECTOR_AUTO
|
|
||||||
stackp-flag := $(call cc-option,-fstack-protector-strong,$(call cc-option,-fstack-protector))
|
KBUILD_CFLAGS += $(stackp-flags-y)
|
||||||
stackp-name := AUTO
|
|
||||||
else
|
|
||||||
ifdef CONFIG_CC_STACKPROTECTOR_REGULAR
|
|
||||||
stackp-flag := -fstack-protector
|
|
||||||
stackp-name := REGULAR
|
|
||||||
else
|
|
||||||
ifdef CONFIG_CC_STACKPROTECTOR_STRONG
|
|
||||||
stackp-flag := -fstack-protector-strong
|
|
||||||
stackp-name := STRONG
|
|
||||||
else
|
|
||||||
# If either there is no stack protector for this architecture or
|
|
||||||
# CONFIG_CC_STACKPROTECTOR_NONE is selected, we're done, and $(stackp-name)
|
|
||||||
# is empty, skipping all remaining stack protector tests.
|
|
||||||
#
|
|
||||||
# Force off for distro compilers that enable stack protector by default.
|
|
||||||
KBUILD_CFLAGS += $(call cc-option, -fno-stack-protector)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
# Find arch-specific stack protector compiler sanity-checking script.
|
|
||||||
ifdef stackp-name
|
|
||||||
ifneq ($(stackp-flag),)
|
|
||||||
stackp-path := $(srctree)/scripts/gcc-$(SRCARCH)_$(BITS)-has-stack-protector.sh
|
|
||||||
stackp-check := $(wildcard $(stackp-path))
|
|
||||||
# If the wildcard test matches a test script, run it to check functionality.
|
|
||||||
ifdef stackp-check
|
|
||||||
ifneq ($(shell $(CONFIG_SHELL) $(stackp-check) $(CC) $(KBUILD_CPPFLAGS) $(biarch)),y)
|
|
||||||
stackp-broken := y
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
ifndef stackp-broken
|
|
||||||
# If the stack protector is functional, enable code that depends on it.
|
|
||||||
KBUILD_CPPFLAGS += -DCONFIG_CC_STACKPROTECTOR
|
|
||||||
# Either we've already detected the flag (for AUTO) or we'll fail the
|
|
||||||
# build in the prepare-compiler-check rule (for specific flag).
|
|
||||||
KBUILD_CFLAGS += $(stackp-flag)
|
|
||||||
else
|
|
||||||
# We have to make sure stack protector is unconditionally disabled if
|
|
||||||
# the compiler is broken (in case we're going to continue the build in
|
|
||||||
# AUTO mode).
|
|
||||||
KBUILD_CFLAGS += $(call cc-option, -fno-stack-protector)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(cc-name),clang)
|
ifeq ($(cc-name),clang)
|
||||||
KBUILD_CPPFLAGS += $(call cc-option,-Qunused-arguments,)
|
KBUILD_CPPFLAGS += $(call cc-option,-Qunused-arguments,)
|
||||||
|
@ -1112,7 +1074,7 @@ endif
|
||||||
# prepare2 creates a makefile if using a separate output directory.
|
# prepare2 creates a makefile if using a separate output directory.
|
||||||
# From this point forward, .config has been reprocessed, so any rules
|
# From this point forward, .config has been reprocessed, so any rules
|
||||||
# that need to depend on updated CONFIG_* values can be checked here.
|
# that need to depend on updated CONFIG_* values can be checked here.
|
||||||
prepare2: prepare3 prepare-compiler-check outputmakefile asm-generic
|
prepare2: prepare3 outputmakefile asm-generic
|
||||||
|
|
||||||
prepare1: prepare2 $(version_h) $(autoksyms_h) include/generated/utsrelease.h \
|
prepare1: prepare2 $(version_h) $(autoksyms_h) include/generated/utsrelease.h \
|
||||||
include/config/auto.conf
|
include/config/auto.conf
|
||||||
|
@ -1138,43 +1100,6 @@ uapi-asm-generic:
|
||||||
PHONY += prepare-objtool
|
PHONY += prepare-objtool
|
||||||
prepare-objtool: $(objtool_target)
|
prepare-objtool: $(objtool_target)
|
||||||
|
|
||||||
# Check for CONFIG flags that require compiler support. Abort the build
|
|
||||||
# after .config has been processed, but before the kernel build starts.
|
|
||||||
#
|
|
||||||
# For security-sensitive CONFIG options, we don't want to fallback and/or
|
|
||||||
# silently change which compiler flags will be used, since that leads to
|
|
||||||
# producing kernels with different security feature characteristics
|
|
||||||
# depending on the compiler used. (For example, "But I selected
|
|
||||||
# CC_STACKPROTECTOR_STRONG! Why did it build with _REGULAR?!")
|
|
||||||
PHONY += prepare-compiler-check
|
|
||||||
prepare-compiler-check: FORCE
|
|
||||||
# Make sure compiler supports requested stack protector flag.
|
|
||||||
ifdef stackp-name
|
|
||||||
# Warn about CONFIG_CC_STACKPROTECTOR_AUTO having found no option.
|
|
||||||
ifeq ($(stackp-flag),)
|
|
||||||
@echo CONFIG_CC_STACKPROTECTOR_$(stackp-name): \
|
|
||||||
Compiler does not support any known stack-protector >&2
|
|
||||||
else
|
|
||||||
# Fail if specifically requested stack protector is missing.
|
|
||||||
ifeq ($(call cc-option, $(stackp-flag)),)
|
|
||||||
@echo Cannot use CONFIG_CC_STACKPROTECTOR_$(stackp-name): \
|
|
||||||
$(stackp-flag) not supported by compiler >&2 && exit 1
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
# Make sure compiler does not have buggy stack-protector support. If a
|
|
||||||
# specific stack-protector was requested, fail the build, otherwise warn.
|
|
||||||
ifdef stackp-broken
|
|
||||||
ifeq ($(stackp-name),AUTO)
|
|
||||||
@echo CONFIG_CC_STACKPROTECTOR_$(stackp-name): \
|
|
||||||
$(stackp-flag) available but compiler is broken: disabling >&2
|
|
||||||
else
|
|
||||||
@echo Cannot use CONFIG_CC_STACKPROTECTOR_$(stackp-name): \
|
|
||||||
$(stackp-flag) available but compiler is broken >&2 && exit 1
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
@:
|
|
||||||
|
|
||||||
# Generate some files
|
# Generate some files
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
50
arch/Kconfig
50
arch/Kconfig
|
@ -405,6 +405,15 @@ config SECCOMP_FILTER
|
||||||
|
|
||||||
See Documentation/prctl/seccomp_filter.txt for details.
|
See Documentation/prctl/seccomp_filter.txt for details.
|
||||||
|
|
||||||
|
preferred-plugin-hostcc := $(if-success,[ $(gcc-version) -ge 40800 ],$(HOSTCXX),$(HOSTCC))
|
||||||
|
|
||||||
|
config PLUGIN_HOSTCC
|
||||||
|
string
|
||||||
|
default "$(shell,$(srctree)/scripts/gcc-plugin.sh "$(preferred-plugin-hostcc)" "$(HOSTCXX)" "$(CC)")"
|
||||||
|
help
|
||||||
|
Host compiler used to build GCC plugins. This can be $(HOSTCXX),
|
||||||
|
$(HOSTCC), or a null string if GCC plugin is unsupported.
|
||||||
|
|
||||||
config HAVE_GCC_PLUGINS
|
config HAVE_GCC_PLUGINS
|
||||||
bool
|
bool
|
||||||
help
|
help
|
||||||
|
@ -414,7 +423,7 @@ config HAVE_GCC_PLUGINS
|
||||||
menuconfig GCC_PLUGINS
|
menuconfig GCC_PLUGINS
|
||||||
bool "GCC plugins"
|
bool "GCC plugins"
|
||||||
depends on HAVE_GCC_PLUGINS
|
depends on HAVE_GCC_PLUGINS
|
||||||
depends on !COMPILE_TEST
|
depends on PLUGIN_HOSTCC != ""
|
||||||
help
|
help
|
||||||
GCC plugins are loadable modules that provide extra features to the
|
GCC plugins are loadable modules that provide extra features to the
|
||||||
compiler. They are useful for runtime instrumentation and static analysis.
|
compiler. They are useful for runtime instrumentation and static analysis.
|
||||||
|
@ -424,7 +433,7 @@ menuconfig GCC_PLUGINS
|
||||||
config GCC_PLUGIN_CYC_COMPLEXITY
|
config GCC_PLUGIN_CYC_COMPLEXITY
|
||||||
bool "Compute the cyclomatic complexity of a function" if EXPERT
|
bool "Compute the cyclomatic complexity of a function" if EXPERT
|
||||||
depends on GCC_PLUGINS
|
depends on GCC_PLUGINS
|
||||||
depends on !COMPILE_TEST
|
depends on !COMPILE_TEST # too noisy
|
||||||
help
|
help
|
||||||
The complexity M of a function's control flow graph is defined as:
|
The complexity M of a function's control flow graph is defined as:
|
||||||
M = E - N + 2P
|
M = E - N + 2P
|
||||||
|
@ -484,6 +493,7 @@ config GCC_PLUGIN_STRUCTLEAK
|
||||||
config GCC_PLUGIN_STRUCTLEAK_BYREF_ALL
|
config GCC_PLUGIN_STRUCTLEAK_BYREF_ALL
|
||||||
bool "Force initialize all struct type variables passed by reference"
|
bool "Force initialize all struct type variables passed by reference"
|
||||||
depends on GCC_PLUGIN_STRUCTLEAK
|
depends on GCC_PLUGIN_STRUCTLEAK
|
||||||
|
depends on !COMPILE_TEST
|
||||||
help
|
help
|
||||||
Zero initialize any struct type local variable that may be passed by
|
Zero initialize any struct type local variable that may be passed by
|
||||||
reference without having been initialized.
|
reference without having been initialized.
|
||||||
|
@ -491,7 +501,7 @@ config GCC_PLUGIN_STRUCTLEAK_BYREF_ALL
|
||||||
config GCC_PLUGIN_STRUCTLEAK_VERBOSE
|
config GCC_PLUGIN_STRUCTLEAK_VERBOSE
|
||||||
bool "Report forcefully initialized variables"
|
bool "Report forcefully initialized variables"
|
||||||
depends on GCC_PLUGIN_STRUCTLEAK
|
depends on GCC_PLUGIN_STRUCTLEAK
|
||||||
depends on !COMPILE_TEST
|
depends on !COMPILE_TEST # too noisy
|
||||||
help
|
help
|
||||||
This option will cause a warning to be printed each time the
|
This option will cause a warning to be printed each time the
|
||||||
structleak plugin finds a variable it thinks needs to be
|
structleak plugin finds a variable it thinks needs to be
|
||||||
|
@ -531,7 +541,7 @@ config GCC_PLUGIN_RANDSTRUCT
|
||||||
config GCC_PLUGIN_RANDSTRUCT_PERFORMANCE
|
config GCC_PLUGIN_RANDSTRUCT_PERFORMANCE
|
||||||
bool "Use cacheline-aware structure randomization"
|
bool "Use cacheline-aware structure randomization"
|
||||||
depends on GCC_PLUGIN_RANDSTRUCT
|
depends on GCC_PLUGIN_RANDSTRUCT
|
||||||
depends on !COMPILE_TEST
|
depends on !COMPILE_TEST # do not reduce test coverage
|
||||||
help
|
help
|
||||||
If you say Y here, the RANDSTRUCT randomization will make a
|
If you say Y here, the RANDSTRUCT randomization will make a
|
||||||
best effort at restricting randomization to cacheline-sized
|
best effort at restricting randomization to cacheline-sized
|
||||||
|
@ -543,13 +553,16 @@ config HAVE_CC_STACKPROTECTOR
|
||||||
bool
|
bool
|
||||||
help
|
help
|
||||||
An arch should select this symbol if:
|
An arch should select this symbol if:
|
||||||
- its compiler supports the -fstack-protector option
|
|
||||||
- it has implemented a stack canary (e.g. __stack_chk_guard)
|
- it has implemented a stack canary (e.g. __stack_chk_guard)
|
||||||
|
|
||||||
choice
|
config CC_HAS_STACKPROTECTOR_NONE
|
||||||
prompt "Stack Protector buffer overflow detection"
|
def_bool $(cc-option,-fno-stack-protector)
|
||||||
|
|
||||||
|
config CC_STACKPROTECTOR
|
||||||
|
bool "Stack Protector buffer overflow detection"
|
||||||
depends on HAVE_CC_STACKPROTECTOR
|
depends on HAVE_CC_STACKPROTECTOR
|
||||||
default CC_STACKPROTECTOR_AUTO
|
depends on $(cc-option,-fstack-protector)
|
||||||
|
default y
|
||||||
help
|
help
|
||||||
This option turns on the "stack-protector" GCC feature. This
|
This option turns on the "stack-protector" GCC feature. This
|
||||||
feature puts, at the beginning of functions, a canary value on
|
feature puts, at the beginning of functions, a canary value on
|
||||||
|
@ -559,14 +572,6 @@ choice
|
||||||
overwrite the canary, which gets detected and the attack is then
|
overwrite the canary, which gets detected and the attack is then
|
||||||
neutralized via a kernel panic.
|
neutralized via a kernel panic.
|
||||||
|
|
||||||
config CC_STACKPROTECTOR_NONE
|
|
||||||
bool "None"
|
|
||||||
help
|
|
||||||
Disable "stack-protector" GCC feature.
|
|
||||||
|
|
||||||
config CC_STACKPROTECTOR_REGULAR
|
|
||||||
bool "Regular"
|
|
||||||
help
|
|
||||||
Functions will have the stack-protector canary logic added if they
|
Functions will have the stack-protector canary logic added if they
|
||||||
have an 8-byte or larger character array on the stack.
|
have an 8-byte or larger character array on the stack.
|
||||||
|
|
||||||
|
@ -578,7 +583,10 @@ config CC_STACKPROTECTOR_REGULAR
|
||||||
by about 0.3%.
|
by about 0.3%.
|
||||||
|
|
||||||
config CC_STACKPROTECTOR_STRONG
|
config CC_STACKPROTECTOR_STRONG
|
||||||
bool "Strong"
|
bool "Strong Stack Protector"
|
||||||
|
depends on CC_STACKPROTECTOR
|
||||||
|
depends on $(cc-option,-fstack-protector-strong)
|
||||||
|
default y
|
||||||
help
|
help
|
||||||
Functions will have the stack-protector canary logic added in any
|
Functions will have the stack-protector canary logic added in any
|
||||||
of the following conditions:
|
of the following conditions:
|
||||||
|
@ -596,14 +604,6 @@ config CC_STACKPROTECTOR_STRONG
|
||||||
about 20% of all kernel functions, which increases the kernel code
|
about 20% of all kernel functions, which increases the kernel code
|
||||||
size by about 2%.
|
size by about 2%.
|
||||||
|
|
||||||
config CC_STACKPROTECTOR_AUTO
|
|
||||||
bool "Automatic"
|
|
||||||
help
|
|
||||||
If the compiler supports it, the best available stack-protector
|
|
||||||
option will be chosen.
|
|
||||||
|
|
||||||
endchoice
|
|
||||||
|
|
||||||
config HAVE_ARCH_WITHIN_STACK_FRAMES
|
config HAVE_ARCH_WITHIN_STACK_FRAMES
|
||||||
bool
|
bool
|
||||||
help
|
help
|
||||||
|
|
|
@ -46,6 +46,7 @@ config ARM64
|
||||||
select ARCH_USE_QUEUED_RWLOCKS
|
select ARCH_USE_QUEUED_RWLOCKS
|
||||||
select ARCH_SUPPORTS_MEMORY_FAILURE
|
select ARCH_SUPPORTS_MEMORY_FAILURE
|
||||||
select ARCH_SUPPORTS_ATOMIC_RMW
|
select ARCH_SUPPORTS_ATOMIC_RMW
|
||||||
|
select ARCH_SUPPORTS_INT128 if GCC_VERSION >= 50000 || CC_IS_CLANG
|
||||||
select ARCH_SUPPORTS_NUMA_BALANCING
|
select ARCH_SUPPORTS_NUMA_BALANCING
|
||||||
select ARCH_WANT_COMPAT_IPC_PARSE_VERSION
|
select ARCH_WANT_COMPAT_IPC_PARSE_VERSION
|
||||||
select ARCH_WANT_FRAME_POINTERS
|
select ARCH_WANT_FRAME_POINTERS
|
||||||
|
|
|
@ -56,12 +56,6 @@ KBUILD_AFLAGS += $(lseinstr) $(brokengasinst)
|
||||||
KBUILD_CFLAGS += $(call cc-option,-mabi=lp64)
|
KBUILD_CFLAGS += $(call cc-option,-mabi=lp64)
|
||||||
KBUILD_AFLAGS += $(call cc-option,-mabi=lp64)
|
KBUILD_AFLAGS += $(call cc-option,-mabi=lp64)
|
||||||
|
|
||||||
ifeq ($(cc-name),clang)
|
|
||||||
KBUILD_CFLAGS += -DCONFIG_ARCH_SUPPORTS_INT128
|
|
||||||
else
|
|
||||||
KBUILD_CFLAGS += $(call cc-ifversion, -ge, 0500, -DCONFIG_ARCH_SUPPORTS_INT128)
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(CONFIG_CPU_BIG_ENDIAN), y)
|
ifeq ($(CONFIG_CPU_BIG_ENDIAN), y)
|
||||||
KBUILD_CPPFLAGS += -mbig-endian
|
KBUILD_CPPFLAGS += -mbig-endian
|
||||||
CHECKFLAGS += -D__AARCH64EB__
|
CHECKFLAGS += -D__AARCH64EB__
|
||||||
|
|
|
@ -190,7 +190,7 @@ config PPC
|
||||||
select HAVE_FTRACE_MCOUNT_RECORD
|
select HAVE_FTRACE_MCOUNT_RECORD
|
||||||
select HAVE_FUNCTION_GRAPH_TRACER
|
select HAVE_FUNCTION_GRAPH_TRACER
|
||||||
select HAVE_FUNCTION_TRACER
|
select HAVE_FUNCTION_TRACER
|
||||||
select HAVE_GCC_PLUGINS
|
select HAVE_GCC_PLUGINS if GCC_VERSION >= 50200 # plugin support on gcc <= 5.1 is buggy on PPC
|
||||||
select HAVE_GENERIC_GUP
|
select HAVE_GENERIC_GUP
|
||||||
select HAVE_HW_BREAKPOINT if PERF_EVENTS && (PPC_BOOK3S || PPC_8xx)
|
select HAVE_HW_BREAKPOINT if PERF_EVENTS && (PPC_BOOK3S || PPC_8xx)
|
||||||
select HAVE_IDE
|
select HAVE_IDE
|
||||||
|
@ -461,23 +461,9 @@ config LD_HEAD_STUB_CATCH
|
||||||
|
|
||||||
If unsure, say "N".
|
If unsure, say "N".
|
||||||
|
|
||||||
config DISABLE_MPROFILE_KERNEL
|
|
||||||
bool "Disable use of mprofile-kernel for kernel tracing"
|
|
||||||
depends on PPC64 && CPU_LITTLE_ENDIAN
|
|
||||||
default y
|
|
||||||
help
|
|
||||||
Selecting this options disables use of the mprofile-kernel ABI for
|
|
||||||
kernel tracing. That will cause options such as live patching
|
|
||||||
(CONFIG_LIVEPATCH) which depend on CONFIG_DYNAMIC_FTRACE_WITH_REGS to
|
|
||||||
be disabled also.
|
|
||||||
|
|
||||||
If you have a toolchain which supports mprofile-kernel, then you can
|
|
||||||
disable this. Otherwise leave it enabled. If you're not sure, say
|
|
||||||
"Y".
|
|
||||||
|
|
||||||
config MPROFILE_KERNEL
|
config MPROFILE_KERNEL
|
||||||
depends on PPC64 && CPU_LITTLE_ENDIAN
|
depends on PPC64 && CPU_LITTLE_ENDIAN
|
||||||
def_bool !DISABLE_MPROFILE_KERNEL
|
def_bool $(success,$(srctree)/arch/powerpc/tools/gcc-check-mprofile-kernel.sh $(CC) -I$(srctree)/include -D__KERNEL__)
|
||||||
|
|
||||||
config HOTPLUG_CPU
|
config HOTPLUG_CPU
|
||||||
bool "Support for enabling/disabling CPUs"
|
bool "Support for enabling/disabling CPUs"
|
||||||
|
|
|
@ -161,18 +161,7 @@ CFLAGS-$(CONFIG_GENERIC_CPU) += -mcpu=powerpc64
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_MPROFILE_KERNEL
|
ifdef CONFIG_MPROFILE_KERNEL
|
||||||
ifeq ($(shell $(srctree)/arch/powerpc/tools/gcc-check-mprofile-kernel.sh $(CC) -I$(srctree)/include -D__KERNEL__),OK)
|
CC_FLAGS_FTRACE := -pg -mprofile-kernel
|
||||||
CC_FLAGS_FTRACE := -pg -mprofile-kernel
|
|
||||||
KBUILD_CPPFLAGS += -DCC_USING_MPROFILE_KERNEL
|
|
||||||
else
|
|
||||||
# If the user asked for mprofile-kernel but the toolchain doesn't
|
|
||||||
# support it, emit a warning and deliberately break the build later
|
|
||||||
# with mprofile-kernel-not-supported. We would prefer to make this an
|
|
||||||
# error right here, but then the user would never be able to run
|
|
||||||
# oldconfig to change their configuration.
|
|
||||||
$(warning Compiler does not support mprofile-kernel, set CONFIG_DISABLE_MPROFILE_KERNEL)
|
|
||||||
CC_FLAGS_FTRACE := -mprofile-kernel-not-supported
|
|
||||||
endif
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CFLAGS-$(CONFIG_CELL_CPU) += $(call cc-option,-mcpu=cell)
|
CFLAGS-$(CONFIG_CELL_CPU) += $(call cc-option,-mcpu=cell)
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
#include <asm-generic/module.h>
|
#include <asm-generic/module.h>
|
||||||
|
|
||||||
|
|
||||||
#ifdef CC_USING_MPROFILE_KERNEL
|
#ifdef CONFIG_MPROFILE_KERNEL
|
||||||
#define MODULE_ARCH_VERMAGIC_FTRACE "mprofile-kernel "
|
#define MODULE_ARCH_VERMAGIC_FTRACE "mprofile-kernel "
|
||||||
#else
|
#else
|
||||||
#define MODULE_ARCH_VERMAGIC_FTRACE ""
|
#define MODULE_ARCH_VERMAGIC_FTRACE ""
|
||||||
|
|
|
@ -466,7 +466,7 @@ static unsigned long stub_for_addr(const Elf64_Shdr *sechdrs,
|
||||||
return (unsigned long)&stubs[i];
|
return (unsigned long)&stubs[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CC_USING_MPROFILE_KERNEL
|
#ifdef CONFIG_MPROFILE_KERNEL
|
||||||
static bool is_mprofile_mcount_callsite(const char *name, u32 *instruction)
|
static bool is_mprofile_mcount_callsite(const char *name, u32 *instruction)
|
||||||
{
|
{
|
||||||
if (strcmp("_mcount", name))
|
if (strcmp("_mcount", name))
|
||||||
|
@ -753,7 +753,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
|
||||||
|
|
||||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||||
|
|
||||||
#ifdef CC_USING_MPROFILE_KERNEL
|
#ifdef CONFIG_MPROFILE_KERNEL
|
||||||
|
|
||||||
#define PACATOC offsetof(struct paca_struct, kernel_toc)
|
#define PACATOC offsetof(struct paca_struct, kernel_toc)
|
||||||
|
|
||||||
|
|
|
@ -144,7 +144,7 @@ __ftrace_make_nop(struct module *mod,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CC_USING_MPROFILE_KERNEL
|
#ifdef CONFIG_MPROFILE_KERNEL
|
||||||
/* When using -mkernel_profile there is no load to jump over */
|
/* When using -mkernel_profile there is no load to jump over */
|
||||||
pop = PPC_INST_NOP;
|
pop = PPC_INST_NOP;
|
||||||
|
|
||||||
|
@ -188,7 +188,7 @@ __ftrace_make_nop(struct module *mod,
|
||||||
pr_err("Expected %08x found %08x\n", PPC_INST_LD_TOC, op);
|
pr_err("Expected %08x found %08x\n", PPC_INST_LD_TOC, op);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
#endif /* CC_USING_MPROFILE_KERNEL */
|
#endif /* CONFIG_MPROFILE_KERNEL */
|
||||||
|
|
||||||
if (patch_instruction((unsigned int *)ip, pop)) {
|
if (patch_instruction((unsigned int *)ip, pop)) {
|
||||||
pr_err("Patching NOP failed.\n");
|
pr_err("Patching NOP failed.\n");
|
||||||
|
@ -324,7 +324,7 @@ int ftrace_make_nop(struct module *mod,
|
||||||
* They should effectively be a NOP, and follow formal constraints,
|
* They should effectively be a NOP, and follow formal constraints,
|
||||||
* depending on the ABI. Return false if they don't.
|
* depending on the ABI. Return false if they don't.
|
||||||
*/
|
*/
|
||||||
#ifndef CC_USING_MPROFILE_KERNEL
|
#ifndef CONFIG_MPROFILE_KERNEL
|
||||||
static int
|
static int
|
||||||
expected_nop_sequence(void *ip, unsigned int op0, unsigned int op1)
|
expected_nop_sequence(void *ip, unsigned int op0, unsigned int op1)
|
||||||
{
|
{
|
||||||
|
|
|
@ -24,5 +24,4 @@ echo -e "#include <linux/compiler.h>\nnotrace int func() { return 0; }" | \
|
||||||
2> /dev/null | grep -q "_mcount" && \
|
2> /dev/null | grep -q "_mcount" && \
|
||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
echo "OK"
|
|
||||||
exit 0
|
exit 0
|
||||||
|
|
|
@ -7,9 +7,9 @@
|
||||||
#ifdef CONFIG_DWARF_UNWINDER
|
#ifdef CONFIG_DWARF_UNWINDER
|
||||||
#define DWARF_EH_FRAME \
|
#define DWARF_EH_FRAME \
|
||||||
.eh_frame : AT(ADDR(.eh_frame) - LOAD_OFFSET) { \
|
.eh_frame : AT(ADDR(.eh_frame) - LOAD_OFFSET) { \
|
||||||
VMLINUX_SYMBOL(__start_eh_frame) = .; \
|
__start_eh_frame = .; \
|
||||||
*(.eh_frame) \
|
*(.eh_frame) \
|
||||||
VMLINUX_SYMBOL(__stop_eh_frame) = .; \
|
__stop_eh_frame = .; \
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#define DWARF_EH_FRAME
|
#define DWARF_EH_FRAME
|
||||||
|
|
|
@ -130,7 +130,7 @@ config X86
|
||||||
select HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD if X86_64
|
select HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD if X86_64
|
||||||
select HAVE_ARCH_VMAP_STACK if X86_64
|
select HAVE_ARCH_VMAP_STACK if X86_64
|
||||||
select HAVE_ARCH_WITHIN_STACK_FRAMES
|
select HAVE_ARCH_WITHIN_STACK_FRAMES
|
||||||
select HAVE_CC_STACKPROTECTOR
|
select HAVE_CC_STACKPROTECTOR if CC_HAS_SANE_STACKPROTECTOR
|
||||||
select HAVE_CMPXCHG_DOUBLE
|
select HAVE_CMPXCHG_DOUBLE
|
||||||
select HAVE_CMPXCHG_LOCAL
|
select HAVE_CMPXCHG_LOCAL
|
||||||
select HAVE_CONTEXT_TRACKING if X86_64
|
select HAVE_CONTEXT_TRACKING if X86_64
|
||||||
|
@ -346,6 +346,15 @@ config PGTABLE_LEVELS
|
||||||
default 2
|
default 2
|
||||||
|
|
||||||
source "init/Kconfig"
|
source "init/Kconfig"
|
||||||
|
|
||||||
|
config CC_HAS_SANE_STACKPROTECTOR
|
||||||
|
bool
|
||||||
|
default $(success,$(srctree)/scripts/gcc-x86_64-has-stack-protector.sh $(CC)) if 64BIT
|
||||||
|
default $(success,$(srctree)/scripts/gcc-x86_32-has-stack-protector.sh $(CC))
|
||||||
|
help
|
||||||
|
We have to make sure stack protector is unconditionally disabled if
|
||||||
|
the compiler produces broken code.
|
||||||
|
|
||||||
source "kernel/Kconfig.freezer"
|
source "kernel/Kconfig.freezer"
|
||||||
|
|
||||||
menu "Processor type and features"
|
menu "Processor type and features"
|
||||||
|
|
|
@ -24,16 +24,16 @@
|
||||||
|
|
||||||
#ifndef cond_syscall
|
#ifndef cond_syscall
|
||||||
#define cond_syscall(x) asm( \
|
#define cond_syscall(x) asm( \
|
||||||
".weak " VMLINUX_SYMBOL_STR(x) "\n\t" \
|
".weak " __stringify(x) "\n\t" \
|
||||||
".set " VMLINUX_SYMBOL_STR(x) "," \
|
".set " __stringify(x) "," \
|
||||||
VMLINUX_SYMBOL_STR(sys_ni_syscall))
|
__stringify(sys_ni_syscall))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef SYSCALL_ALIAS
|
#ifndef SYSCALL_ALIAS
|
||||||
#define SYSCALL_ALIAS(alias, name) asm( \
|
#define SYSCALL_ALIAS(alias, name) asm( \
|
||||||
".globl " VMLINUX_SYMBOL_STR(alias) "\n\t" \
|
".globl " __stringify(alias) "\n\t" \
|
||||||
".set " VMLINUX_SYMBOL_STR(alias) "," \
|
".set " __stringify(alias) "," \
|
||||||
VMLINUX_SYMBOL_STR(name))
|
__stringify(name))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define __page_aligned_data __section(.data..page_aligned) __aligned(PAGE_SIZE)
|
#define __page_aligned_data __section(.data..page_aligned) __aligned(PAGE_SIZE)
|
||||||
|
|
15
init/Kconfig
15
init/Kconfig
|
@ -8,6 +8,21 @@ config DEFCONFIG_LIST
|
||||||
default ARCH_DEFCONFIG
|
default ARCH_DEFCONFIG
|
||||||
default "arch/$(ARCH)/defconfig"
|
default "arch/$(ARCH)/defconfig"
|
||||||
|
|
||||||
|
config CC_IS_GCC
|
||||||
|
def_bool $(success,$(CC) --version | head -n 1 | grep -q gcc)
|
||||||
|
|
||||||
|
config GCC_VERSION
|
||||||
|
int
|
||||||
|
default $(shell,$(srctree)/scripts/gcc-version.sh -p $(CC) | sed 's/^0*//') if CC_IS_GCC
|
||||||
|
default 0
|
||||||
|
|
||||||
|
config CC_IS_CLANG
|
||||||
|
def_bool $(success,$(CC) --version | head -n 1 | grep -q clang)
|
||||||
|
|
||||||
|
config CLANG_VERSION
|
||||||
|
int
|
||||||
|
default $(shell,$(srctree)/scripts/clang-version.sh $(CC))
|
||||||
|
|
||||||
config CONSTRUCTORS
|
config CONSTRUCTORS
|
||||||
bool
|
bool
|
||||||
depends on !UML
|
depends on !UML
|
||||||
|
|
|
@ -53,23 +53,16 @@ config GCOV_PROFILE_ALL
|
||||||
choice
|
choice
|
||||||
prompt "Specify GCOV format"
|
prompt "Specify GCOV format"
|
||||||
depends on GCOV_KERNEL
|
depends on GCOV_KERNEL
|
||||||
default GCOV_FORMAT_AUTODETECT
|
|
||||||
---help---
|
---help---
|
||||||
The gcov format is usually determined by the GCC version, but there are
|
The gcov format is usually determined by the GCC version, and the
|
||||||
|
default is chosen according to your GCC version. However, there are
|
||||||
exceptions where format changes are integrated in lower-version GCCs.
|
exceptions where format changes are integrated in lower-version GCCs.
|
||||||
In such a case use this option to adjust the format used in the kernel
|
In such a case, change this option to adjust the format used in the
|
||||||
accordingly.
|
kernel accordingly.
|
||||||
|
|
||||||
If unsure, choose "Autodetect".
|
|
||||||
|
|
||||||
config GCOV_FORMAT_AUTODETECT
|
|
||||||
bool "Autodetect"
|
|
||||||
---help---
|
|
||||||
Select this option to use the format that corresponds to your GCC
|
|
||||||
version.
|
|
||||||
|
|
||||||
config GCOV_FORMAT_3_4
|
config GCOV_FORMAT_3_4
|
||||||
bool "GCC 3.4 format"
|
bool "GCC 3.4 format"
|
||||||
|
depends on CC_IS_GCC && GCC_VERSION < 40700
|
||||||
---help---
|
---help---
|
||||||
Select this option to use the format defined by GCC 3.4.
|
Select this option to use the format defined by GCC 3.4.
|
||||||
|
|
||||||
|
|
|
@ -4,5 +4,3 @@ ccflags-y := -DSRCTREE='"$(srctree)"' -DOBJTREE='"$(objtree)"'
|
||||||
obj-y := base.o fs.o
|
obj-y := base.o fs.o
|
||||||
obj-$(CONFIG_GCOV_FORMAT_3_4) += gcc_3_4.o
|
obj-$(CONFIG_GCOV_FORMAT_3_4) += gcc_3_4.o
|
||||||
obj-$(CONFIG_GCOV_FORMAT_4_7) += gcc_4_7.o
|
obj-$(CONFIG_GCOV_FORMAT_4_7) += gcc_4_7.o
|
||||||
obj-$(CONFIG_GCOV_FORMAT_AUTODETECT) += $(call cc-ifversion, -lt, 0407, \
|
|
||||||
gcc_3_4.o, gcc_4_7.o)
|
|
||||||
|
|
|
@ -736,12 +736,15 @@ config ARCH_HAS_KCOV
|
||||||
only for x86_64. KCOV requires testing on other archs, and most likely
|
only for x86_64. KCOV requires testing on other archs, and most likely
|
||||||
disabling of instrumentation for some early boot code.
|
disabling of instrumentation for some early boot code.
|
||||||
|
|
||||||
|
config CC_HAS_SANCOV_TRACE_PC
|
||||||
|
def_bool $(cc-option,-fsanitize-coverage=trace-pc)
|
||||||
|
|
||||||
config KCOV
|
config KCOV
|
||||||
bool "Code coverage for fuzzing"
|
bool "Code coverage for fuzzing"
|
||||||
depends on ARCH_HAS_KCOV
|
depends on ARCH_HAS_KCOV
|
||||||
|
depends on CC_HAS_SANCOV_TRACE_PC || GCC_PLUGINS
|
||||||
select DEBUG_FS
|
select DEBUG_FS
|
||||||
select GCC_PLUGINS if !COMPILE_TEST
|
select GCC_PLUGIN_SANCOV if !CC_HAS_SANCOV_TRACE_PC
|
||||||
select GCC_PLUGIN_SANCOV if !COMPILE_TEST
|
|
||||||
help
|
help
|
||||||
KCOV exposes kernel code coverage information in a form suitable
|
KCOV exposes kernel code coverage information in a form suitable
|
||||||
for coverage-guided fuzzing (randomized testing).
|
for coverage-guided fuzzing (randomized testing).
|
||||||
|
@ -755,7 +758,7 @@ config KCOV
|
||||||
config KCOV_ENABLE_COMPARISONS
|
config KCOV_ENABLE_COMPARISONS
|
||||||
bool "Enable comparison operands collection by KCOV"
|
bool "Enable comparison operands collection by KCOV"
|
||||||
depends on KCOV
|
depends on KCOV
|
||||||
default n
|
depends on $(cc-option,-fsanitize-coverage=trace-cmp)
|
||||||
help
|
help
|
||||||
KCOV also exposes operands of every comparison in the instrumented
|
KCOV also exposes operands of every comparison in the instrumented
|
||||||
code along with operand sizes and PCs of the comparison instructions.
|
code along with operand sizes and PCs of the comparison instructions.
|
||||||
|
@ -765,7 +768,7 @@ config KCOV_ENABLE_COMPARISONS
|
||||||
config KCOV_INSTRUMENT_ALL
|
config KCOV_INSTRUMENT_ALL
|
||||||
bool "Instrument all code by default"
|
bool "Instrument all code by default"
|
||||||
depends on KCOV
|
depends on KCOV
|
||||||
default y if KCOV
|
default y
|
||||||
help
|
help
|
||||||
If you are doing generic system call fuzzing (like e.g. syzkaller),
|
If you are doing generic system call fuzzing (like e.g. syzkaller),
|
||||||
then you will want to instrument the whole kernel and you should
|
then you will want to instrument the whole kernel and you should
|
||||||
|
|
|
@ -25,3 +25,6 @@ cc-option = $(success,$(CC) -Werror $(1) -E -x c /dev/null -o /dev/null)
|
||||||
# $(ld-option,<flag>)
|
# $(ld-option,<flag>)
|
||||||
# Return y if the linker supports <flag>, n otherwise
|
# Return y if the linker supports <flag>, n otherwise
|
||||||
ld-option = $(success,$(LD) -v $(1))
|
ld-option = $(success,$(LD) -v $(1))
|
||||||
|
|
||||||
|
# gcc version including patch level
|
||||||
|
gcc-version := $(shell,$(srctree)/scripts/gcc-version.sh -p $(CC) | sed 's/^0*//')
|
||||||
|
|
|
@ -1,84 +1,37 @@
|
||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
ifdef CONFIG_GCC_PLUGINS
|
gcc-plugin-$(CONFIG_GCC_PLUGIN_CYC_COMPLEXITY) += cyc_complexity_plugin.so
|
||||||
__PLUGINCC := $(call cc-ifversion, -ge, 0408, $(HOSTCXX), $(HOSTCC))
|
|
||||||
PLUGINCC := $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-plugin.sh "$(__PLUGINCC)" "$(HOSTCXX)" "$(CC)")
|
|
||||||
|
|
||||||
SANCOV_PLUGIN := -fplugin=$(objtree)/scripts/gcc-plugins/sancov_plugin.so
|
gcc-plugin-$(CONFIG_GCC_PLUGIN_LATENT_ENTROPY) += latent_entropy_plugin.so
|
||||||
|
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_LATENT_ENTROPY) += -DLATENT_ENTROPY_PLUGIN
|
||||||
gcc-plugin-$(CONFIG_GCC_PLUGIN_CYC_COMPLEXITY) += cyc_complexity_plugin.so
|
ifdef CONFIG_GCC_PLUGIN_LATENT_ENTROPY
|
||||||
|
|
||||||
gcc-plugin-$(CONFIG_GCC_PLUGIN_LATENT_ENTROPY) += latent_entropy_plugin.so
|
|
||||||
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_LATENT_ENTROPY) += -DLATENT_ENTROPY_PLUGIN
|
|
||||||
ifdef CONFIG_GCC_PLUGIN_LATENT_ENTROPY
|
|
||||||
DISABLE_LATENT_ENTROPY_PLUGIN += -fplugin-arg-latent_entropy_plugin-disable
|
DISABLE_LATENT_ENTROPY_PLUGIN += -fplugin-arg-latent_entropy_plugin-disable
|
||||||
endif
|
|
||||||
|
|
||||||
ifdef CONFIG_GCC_PLUGIN_SANCOV
|
|
||||||
ifeq ($(strip $(CFLAGS_KCOV)),)
|
|
||||||
# It is needed because of the gcc-plugin.sh and gcc version checks.
|
|
||||||
gcc-plugin-$(CONFIG_GCC_PLUGIN_SANCOV) += sancov_plugin.so
|
|
||||||
|
|
||||||
ifneq ($(PLUGINCC),)
|
|
||||||
CFLAGS_KCOV := $(SANCOV_PLUGIN)
|
|
||||||
else
|
|
||||||
$(warning warning: cannot use CONFIG_KCOV: -fsanitize-coverage=trace-pc is not supported by compiler)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
gcc-plugin-$(CONFIG_GCC_PLUGIN_STRUCTLEAK) += structleak_plugin.so
|
|
||||||
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK_VERBOSE) += -fplugin-arg-structleak_plugin-verbose
|
|
||||||
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL) += -fplugin-arg-structleak_plugin-byref-all
|
|
||||||
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK) += -DSTRUCTLEAK_PLUGIN
|
|
||||||
|
|
||||||
gcc-plugin-$(CONFIG_GCC_PLUGIN_RANDSTRUCT) += randomize_layout_plugin.so
|
|
||||||
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_RANDSTRUCT) += -DRANDSTRUCT_PLUGIN
|
|
||||||
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_RANDSTRUCT_PERFORMANCE) += -fplugin-arg-randomize_layout_plugin-performance-mode
|
|
||||||
|
|
||||||
GCC_PLUGINS_CFLAGS := $(strip $(addprefix -fplugin=$(objtree)/scripts/gcc-plugins/, $(gcc-plugin-y)) $(gcc-plugin-cflags-y))
|
|
||||||
|
|
||||||
export PLUGINCC GCC_PLUGINS_CFLAGS GCC_PLUGIN GCC_PLUGIN_SUBDIR
|
|
||||||
export SANCOV_PLUGIN DISABLE_LATENT_ENTROPY_PLUGIN
|
|
||||||
|
|
||||||
ifneq ($(PLUGINCC),)
|
|
||||||
# SANCOV_PLUGIN can be only in CFLAGS_KCOV because avoid duplication.
|
|
||||||
GCC_PLUGINS_CFLAGS := $(filter-out $(SANCOV_PLUGIN), $(GCC_PLUGINS_CFLAGS))
|
|
||||||
endif
|
|
||||||
|
|
||||||
KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS)
|
|
||||||
GCC_PLUGIN := $(gcc-plugin-y)
|
|
||||||
GCC_PLUGIN_SUBDIR := $(gcc-plugin-subdir-y)
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# If plugins aren't supported, abort the build before hard-to-read compiler
|
gcc-plugin-$(CONFIG_GCC_PLUGIN_SANCOV) += sancov_plugin.so
|
||||||
# errors start getting spewed by the main build.
|
gcc-plugin-$(CONFIG_GCC_PLUGIN_STRUCTLEAK) += structleak_plugin.so
|
||||||
PHONY += gcc-plugins-check
|
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK_VERBOSE) += -fplugin-arg-structleak_plugin-verbose
|
||||||
gcc-plugins-check: FORCE
|
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL) += -fplugin-arg-structleak_plugin-byref-all
|
||||||
ifdef CONFIG_GCC_PLUGINS
|
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK) += -DSTRUCTLEAK_PLUGIN
|
||||||
ifeq ($(PLUGINCC),)
|
|
||||||
ifneq ($(GCC_PLUGINS_CFLAGS),)
|
gcc-plugin-$(CONFIG_GCC_PLUGIN_RANDSTRUCT) += randomize_layout_plugin.so
|
||||||
# Various gccs between 4.5 and 5.1 have bugs on powerpc due to missing
|
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_RANDSTRUCT) += -DRANDSTRUCT_PLUGIN
|
||||||
# header files. gcc <= 4.6 doesn't work at all, gccs from 4.8 to 5.1 have
|
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_RANDSTRUCT_PERFORMANCE) += -fplugin-arg-randomize_layout_plugin-performance-mode
|
||||||
# issues with 64-bit targets.
|
|
||||||
ifeq ($(ARCH),powerpc)
|
GCC_PLUGINS_CFLAGS := $(strip $(addprefix -fplugin=$(objtree)/scripts/gcc-plugins/, $(gcc-plugin-y)) $(gcc-plugin-cflags-y))
|
||||||
ifeq ($(call cc-ifversion, -le, 0501, y), y)
|
|
||||||
@echo "Cannot use CONFIG_GCC_PLUGINS: plugin support on gcc <= 5.1 is buggy on powerpc, please upgrade to gcc 5.2 or newer" >&2 && exit 1
|
export GCC_PLUGINS_CFLAGS GCC_PLUGIN GCC_PLUGIN_SUBDIR
|
||||||
endif
|
export DISABLE_LATENT_ENTROPY_PLUGIN
|
||||||
endif
|
|
||||||
ifeq ($(call cc-ifversion, -ge, 0405, y), y)
|
# sancov_plugin.so can be only in CFLAGS_KCOV because avoid duplication.
|
||||||
$(Q)$(srctree)/scripts/gcc-plugin.sh --show-error "$(__PLUGINCC)" "$(HOSTCXX)" "$(CC)" || true
|
GCC_PLUGINS_CFLAGS := $(filter-out %/sancov_plugin.so, $(GCC_PLUGINS_CFLAGS))
|
||||||
@echo "Cannot use CONFIG_GCC_PLUGINS: your gcc installation does not support plugins, perhaps the necessary headers are missing?" >&2 && exit 1
|
|
||||||
else
|
KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS)
|
||||||
@echo "Cannot use CONFIG_GCC_PLUGINS: your gcc version does not support plugins, you should upgrade it to at least gcc 4.5" >&2 && exit 1
|
GCC_PLUGIN := $(gcc-plugin-y)
|
||||||
endif
|
GCC_PLUGIN_SUBDIR := $(gcc-plugin-subdir-y)
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
@:
|
|
||||||
|
|
||||||
# Actually do the build, if requested.
|
# Actually do the build, if requested.
|
||||||
PHONY += gcc-plugins
|
PHONY += gcc-plugins
|
||||||
gcc-plugins: scripts_basic gcc-plugins-check
|
gcc-plugins: scripts_basic
|
||||||
ifdef CONFIG_GCC_PLUGINS
|
ifdef CONFIG_GCC_PLUGINS
|
||||||
$(Q)$(MAKE) $(build)=scripts/gcc-plugins
|
$(Q)$(MAKE) $(build)=scripts/gcc-plugins
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
ifdef CONFIG_KCOV
|
ifdef CONFIG_KCOV
|
||||||
CFLAGS_KCOV := $(call cc-option,-fsanitize-coverage=trace-pc,)
|
|
||||||
ifeq ($(CONFIG_KCOV_ENABLE_COMPARISONS),y)
|
kcov-flags-$(CONFIG_CC_HAS_SANCOV_TRACE_PC) += -fsanitize-coverage=trace-pc
|
||||||
CFLAGS_KCOV += $(call cc-option,-fsanitize-coverage=trace-cmp,)
|
kcov-flags-$(CONFIG_KCOV_ENABLE_COMPARISONS) += -fsanitize-coverage=trace-cmp
|
||||||
endif
|
kcov-flags-$(CONFIG_GCC_PLUGIN_SANCOV) += -fplugin=$(objtree)/scripts/gcc-plugins/sancov_plugin.so
|
||||||
|
|
||||||
|
export CFLAGS_KCOV := $(kcov-flags-y)
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -10,24 +10,14 @@
|
||||||
# clang-5.0.1 etc.
|
# clang-5.0.1 etc.
|
||||||
#
|
#
|
||||||
|
|
||||||
if [ "$1" = "-p" ] ; then
|
|
||||||
with_patchlevel=1;
|
|
||||||
shift;
|
|
||||||
fi
|
|
||||||
|
|
||||||
compiler="$*"
|
compiler="$*"
|
||||||
|
|
||||||
if [ ${#compiler} -eq 0 ]; then
|
if !( $compiler --version | grep -q clang) ; then
|
||||||
echo "Error: No compiler specified."
|
echo 0
|
||||||
printf "Usage:\n\t$0 <clang-command>\n"
|
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
MAJOR=$(echo __clang_major__ | $compiler -E -x c - | tail -n 1)
|
MAJOR=$(echo __clang_major__ | $compiler -E -x c - | tail -n 1)
|
||||||
MINOR=$(echo __clang_minor__ | $compiler -E -x c - | tail -n 1)
|
MINOR=$(echo __clang_minor__ | $compiler -E -x c - | tail -n 1)
|
||||||
if [ "x$with_patchlevel" != "x" ] ; then
|
PATCHLEVEL=$(echo __clang_patchlevel__ | $compiler -E -x c - | tail -n 1)
|
||||||
PATCHLEVEL=$(echo __clang_patchlevel__ | $compiler -E -x c - | tail -n 1)
|
printf "%d%02d%02d\\n" $MAJOR $MINOR $PATCHLEVEL
|
||||||
printf "%02d%02d%02d\\n" $MAJOR $MINOR $PATCHLEVEL
|
|
||||||
else
|
|
||||||
printf "%02d%02d\\n" $MAJOR $MINOR
|
|
||||||
fi
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
PLUGINCC := $(CONFIG_PLUGIN_HOSTCC:"%"=%)
|
||||||
GCC_PLUGINS_DIR := $(shell $(CC) -print-file-name=plugin)
|
GCC_PLUGINS_DIR := $(shell $(CC) -print-file-name=plugin)
|
||||||
|
|
||||||
ifeq ($(PLUGINCC),$(HOSTCC))
|
ifeq ($(PLUGINCC),$(HOSTCC))
|
||||||
|
@ -13,10 +14,6 @@ else
|
||||||
export HOST_EXTRACXXFLAGS
|
export HOST_EXTRACXXFLAGS
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(CFLAGS_KCOV), $(SANCOV_PLUGIN))
|
|
||||||
GCC_PLUGIN := $(filter-out $(SANCOV_PLUGIN), $(GCC_PLUGIN))
|
|
||||||
endif
|
|
||||||
|
|
||||||
export HOSTLIBS
|
export HOSTLIBS
|
||||||
|
|
||||||
$(obj)/randomize_layout_plugin.o: $(objtree)/$(obj)/randomize_layout_seed.h
|
$(obj)/randomize_layout_plugin.o: $(objtree)/$(obj)/randomize_layout_seed.h
|
||||||
|
|
|
@ -1,9 +1,4 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
echo "int foo(void) { char X[200]; return 3; }" | $* -S -x c -c -O0 -fstack-protector - -o - 2> /dev/null | grep -q "%gs"
|
echo "int foo(void) { char X[200]; return 3; }" | $* -S -x c -c -m32 -O0 -fstack-protector - -o - 2> /dev/null | grep -q "%gs"
|
||||||
if [ "$?" -eq "0" ] ; then
|
|
||||||
echo y
|
|
||||||
else
|
|
||||||
echo n
|
|
||||||
fi
|
|
||||||
|
|
|
@ -2,8 +2,3 @@
|
||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
echo "int foo(void) { char X[200]; return 3; }" | $* -S -x c -c -O0 -mcmodel=kernel -fno-PIE -fstack-protector - -o - 2> /dev/null | grep -q "%gs"
|
echo "int foo(void) { char X[200]; return 3; }" | $* -S -x c -c -O0 -mcmodel=kernel -fno-PIE -fstack-protector - -o - 2> /dev/null | grep -q "%gs"
|
||||||
if [ "$?" -eq "0" ] ; then
|
|
||||||
echo y
|
|
||||||
else
|
|
||||||
echo n
|
|
||||||
fi
|
|
||||||
|
|
|
@ -165,10 +165,10 @@ sub read_kconfig {
|
||||||
my $last_source = "";
|
my $last_source = "";
|
||||||
|
|
||||||
# Check for any environment variables used
|
# Check for any environment variables used
|
||||||
while ($source =~ /\$(\w+)/ && $last_source ne $source) {
|
while ($source =~ /\$\((\w+)\)/ && $last_source ne $source) {
|
||||||
my $env = $1;
|
my $env = $1;
|
||||||
$last_source = $source;
|
$last_source = $source;
|
||||||
$source =~ s/\$$env/$ENV{$env}/;
|
$source =~ s/\$\($env\)/$ENV{$env}/;
|
||||||
}
|
}
|
||||||
|
|
||||||
open(my $kinfile, '<', $source) || die "Can't open $kconfig";
|
open(my $kinfile, '<', $source) || die "Can't open $kconfig";
|
||||||
|
|
Loading…
Reference in New Issue