|
@@ -680,6 +680,10 @@ endif
|
|
# This selects the stack protector compiler flag. Testing it is delayed
|
|
# This selects the stack protector compiler flag. Testing it is delayed
|
|
# until after .config has been reprocessed, in the prepare-compiler-check
|
|
# until after .config has been reprocessed, in the prepare-compiler-check
|
|
# target.
|
|
# target.
|
|
|
|
+ifdef CONFIG_CC_STACKPROTECTOR_AUTO
|
|
|
|
+ stackp-flag := $(call cc-option,-fstack-protector-strong,$(call cc-option,-fstack-protector))
|
|
|
|
+ stackp-name := AUTO
|
|
|
|
+else
|
|
ifdef CONFIG_CC_STACKPROTECTOR_REGULAR
|
|
ifdef CONFIG_CC_STACKPROTECTOR_REGULAR
|
|
stackp-flag := -fstack-protector
|
|
stackp-flag := -fstack-protector
|
|
stackp-name := REGULAR
|
|
stackp-name := REGULAR
|
|
@@ -688,12 +692,18 @@ ifdef CONFIG_CC_STACKPROTECTOR_STRONG
|
|
stackp-flag := -fstack-protector-strong
|
|
stackp-flag := -fstack-protector-strong
|
|
stackp-name := STRONG
|
|
stackp-name := STRONG
|
|
else
|
|
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.
|
|
# Force off for distro compilers that enable stack protector by default.
|
|
- stackp-flag := $(call cc-option, -fno-stack-protector)
|
|
|
|
|
|
+ KBUILD_CFLAGS += $(call cc-option, -fno-stack-protector)
|
|
|
|
+endif
|
|
endif
|
|
endif
|
|
endif
|
|
endif
|
|
# Find arch-specific stack protector compiler sanity-checking script.
|
|
# Find arch-specific stack protector compiler sanity-checking script.
|
|
ifdef stackp-name
|
|
ifdef stackp-name
|
|
|
|
+ifneq ($(stackp-flag),)
|
|
stackp-path := $(srctree)/scripts/gcc-$(SRCARCH)_$(BITS)-has-stack-protector.sh
|
|
stackp-path := $(srctree)/scripts/gcc-$(SRCARCH)_$(BITS)-has-stack-protector.sh
|
|
stackp-check := $(wildcard $(stackp-path))
|
|
stackp-check := $(wildcard $(stackp-path))
|
|
# If the wildcard test matches a test script, run it to check functionality.
|
|
# If the wildcard test matches a test script, run it to check functionality.
|
|
@@ -705,9 +715,17 @@ ifdef stackp-name
|
|
ifndef stackp-broken
|
|
ifndef stackp-broken
|
|
# If the stack protector is functional, enable code that depends on it.
|
|
# If the stack protector is functional, enable code that depends on it.
|
|
KBUILD_CPPFLAGS += -DCONFIG_CC_STACKPROTECTOR
|
|
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
|
|
endif
|
|
-KBUILD_CFLAGS += $(stackp-flag)
|
|
|
|
|
|
+endif
|
|
|
|
|
|
ifeq ($(cc-name),clang)
|
|
ifeq ($(cc-name),clang)
|
|
KBUILD_CPPFLAGS += $(call cc-option,-Qunused-arguments,)
|
|
KBUILD_CPPFLAGS += $(call cc-option,-Qunused-arguments,)
|
|
@@ -1102,15 +1120,28 @@ PHONY += prepare-compiler-check
|
|
prepare-compiler-check: FORCE
|
|
prepare-compiler-check: FORCE
|
|
# Make sure compiler supports requested stack protector flag.
|
|
# Make sure compiler supports requested stack protector flag.
|
|
ifdef stackp-name
|
|
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)),)
|
|
ifeq ($(call cc-option, $(stackp-flag)),)
|
|
@echo Cannot use CONFIG_CC_STACKPROTECTOR_$(stackp-name): \
|
|
@echo Cannot use CONFIG_CC_STACKPROTECTOR_$(stackp-name): \
|
|
$(stackp-flag) not supported by compiler >&2 && exit 1
|
|
$(stackp-flag) not supported by compiler >&2 && exit 1
|
|
endif
|
|
endif
|
|
|
|
+ endif
|
|
endif
|
|
endif
|
|
-# Make sure compiler does not have buggy stack-protector support.
|
|
|
|
|
|
+# 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
|
|
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): \
|
|
@echo Cannot use CONFIG_CC_STACKPROTECTOR_$(stackp-name): \
|
|
$(stackp-flag) available but compiler is broken >&2 && exit 1
|
|
$(stackp-flag) available but compiler is broken >&2 && exit 1
|
|
|
|
+ endif
|
|
endif
|
|
endif
|
|
@:
|
|
@:
|
|
|
|
|