aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile37
-rw-r--r--arch/Kconfig8
-rw-r--r--kernel/configs/tiny.config4
3 files changed, 45 insertions, 4 deletions
diff --git a/Makefile b/Makefile
index f0f934097f64..d192dd826cce 100644
--- a/Makefile
+++ b/Makefile
@@ -680,6 +680,10 @@ endif
680# This selects the stack protector compiler flag. Testing it is delayed 680# This selects the stack protector compiler flag. Testing it is delayed
681# until after .config has been reprocessed, in the prepare-compiler-check 681# until after .config has been reprocessed, in the prepare-compiler-check
682# target. 682# target.
683ifdef CONFIG_CC_STACKPROTECTOR_AUTO
684 stackp-flag := $(call cc-option,-fstack-protector-strong,$(call cc-option,-fstack-protector))
685 stackp-name := AUTO
686else
683ifdef CONFIG_CC_STACKPROTECTOR_REGULAR 687ifdef CONFIG_CC_STACKPROTECTOR_REGULAR
684 stackp-flag := -fstack-protector 688 stackp-flag := -fstack-protector
685 stackp-name := REGULAR 689 stackp-name := REGULAR
@@ -688,12 +692,18 @@ ifdef CONFIG_CC_STACKPROTECTOR_STRONG
688 stackp-flag := -fstack-protector-strong 692 stackp-flag := -fstack-protector-strong
689 stackp-name := STRONG 693 stackp-name := STRONG
690else 694else
695 # If either there is no stack protector for this architecture or
696 # CONFIG_CC_STACKPROTECTOR_NONE is selected, we're done, and $(stackp-name)
697 # is empty, skipping all remaining stack protector tests.
698 #
691 # Force off for distro compilers that enable stack protector by default. 699 # Force off for distro compilers that enable stack protector by default.
692 stackp-flag := $(call cc-option, -fno-stack-protector) 700 KBUILD_CFLAGS += $(call cc-option, -fno-stack-protector)
701endif
693endif 702endif
694endif 703endif
695# Find arch-specific stack protector compiler sanity-checking script. 704# Find arch-specific stack protector compiler sanity-checking script.
696ifdef stackp-name 705ifdef stackp-name
706ifneq ($(stackp-flag),)
697 stackp-path := $(srctree)/scripts/gcc-$(SRCARCH)_$(BITS)-has-stack-protector.sh 707 stackp-path := $(srctree)/scripts/gcc-$(SRCARCH)_$(BITS)-has-stack-protector.sh
698 stackp-check := $(wildcard $(stackp-path)) 708 stackp-check := $(wildcard $(stackp-path))
699 # If the wildcard test matches a test script, run it to check functionality. 709 # If the wildcard test matches a test script, run it to check functionality.
@@ -705,9 +715,17 @@ ifdef stackp-name
705 ifndef stackp-broken 715 ifndef stackp-broken
706 # If the stack protector is functional, enable code that depends on it. 716 # If the stack protector is functional, enable code that depends on it.
707 KBUILD_CPPFLAGS += -DCONFIG_CC_STACKPROTECTOR 717 KBUILD_CPPFLAGS += -DCONFIG_CC_STACKPROTECTOR
718 # Either we've already detected the flag (for AUTO) or we'll fail the
719 # build in the prepare-compiler-check rule (for specific flag).
720 KBUILD_CFLAGS += $(stackp-flag)
721 else
722 # We have to make sure stack protector is unconditionally disabled if
723 # the compiler is broken (in case we're going to continue the build in
724 # AUTO mode).
725 KBUILD_CFLAGS += $(call cc-option, -fno-stack-protector)
708 endif 726 endif
709endif 727endif
710KBUILD_CFLAGS += $(stackp-flag) 728endif
711 729
712ifeq ($(cc-name),clang) 730ifeq ($(cc-name),clang)
713KBUILD_CPPFLAGS += $(call cc-option,-Qunused-arguments,) 731KBUILD_CPPFLAGS += $(call cc-option,-Qunused-arguments,)
@@ -1102,15 +1120,28 @@ PHONY += prepare-compiler-check
1102prepare-compiler-check: FORCE 1120prepare-compiler-check: FORCE
1103# Make sure compiler supports requested stack protector flag. 1121# Make sure compiler supports requested stack protector flag.
1104ifdef stackp-name 1122ifdef stackp-name
1123 # Warn about CONFIG_CC_STACKPROTECTOR_AUTO having found no option.
1124 ifeq ($(stackp-flag),)
1125 @echo CONFIG_CC_STACKPROTECTOR_$(stackp-name): \
1126 Compiler does not support any known stack-protector >&2
1127 else
1128 # Fail if specifically requested stack protector is missing.
1105 ifeq ($(call cc-option, $(stackp-flag)),) 1129 ifeq ($(call cc-option, $(stackp-flag)),)
1106 @echo Cannot use CONFIG_CC_STACKPROTECTOR_$(stackp-name): \ 1130 @echo Cannot use CONFIG_CC_STACKPROTECTOR_$(stackp-name): \
1107 $(stackp-flag) not supported by compiler >&2 && exit 1 1131 $(stackp-flag) not supported by compiler >&2 && exit 1
1108 endif 1132 endif
1133 endif
1109endif 1134endif
1110# Make sure compiler does not have buggy stack-protector support. 1135# Make sure compiler does not have buggy stack-protector support. If a
1136# specific stack-protector was requested, fail the build, otherwise warn.
1111ifdef stackp-broken 1137ifdef stackp-broken
1138 ifeq ($(stackp-name),AUTO)
1139 @echo CONFIG_CC_STACKPROTECTOR_$(stackp-name): \
1140 $(stackp-flag) available but compiler is broken: disabling >&2
1141 else
1112 @echo Cannot use CONFIG_CC_STACKPROTECTOR_$(stackp-name): \ 1142 @echo Cannot use CONFIG_CC_STACKPROTECTOR_$(stackp-name): \
1113 $(stackp-flag) available but compiler is broken >&2 && exit 1 1143 $(stackp-flag) available but compiler is broken >&2 && exit 1
1144 endif
1114endif 1145endif
1115 @: 1146 @:
1116 1147
diff --git a/arch/Kconfig b/arch/Kconfig
index 9330a9d79dc3..76c0b54443b1 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -541,7 +541,7 @@ config HAVE_CC_STACKPROTECTOR
541choice 541choice
542 prompt "Stack Protector buffer overflow detection" 542 prompt "Stack Protector buffer overflow detection"
543 depends on HAVE_CC_STACKPROTECTOR 543 depends on HAVE_CC_STACKPROTECTOR
544 default CC_STACKPROTECTOR_NONE 544 default CC_STACKPROTECTOR_AUTO
545 help 545 help
546 This option turns on the "stack-protector" GCC feature. This 546 This option turns on the "stack-protector" GCC feature. This
547 feature puts, at the beginning of functions, a canary value on 547 feature puts, at the beginning of functions, a canary value on
@@ -588,6 +588,12 @@ config CC_STACKPROTECTOR_STRONG
588 about 20% of all kernel functions, which increases the kernel code 588 about 20% of all kernel functions, which increases the kernel code
589 size by about 2%. 589 size by about 2%.
590 590
591config CC_STACKPROTECTOR_AUTO
592 bool "Automatic"
593 help
594 If the compiler supports it, the best available stack-protector
595 option will be chosen.
596
591endchoice 597endchoice
592 598
593config THIN_ARCHIVES 599config THIN_ARCHIVES
diff --git a/kernel/configs/tiny.config b/kernel/configs/tiny.config
index 7fa0c4ae6394..9bfdffc100da 100644
--- a/kernel/configs/tiny.config
+++ b/kernel/configs/tiny.config
@@ -10,3 +10,7 @@ CONFIG_OPTIMIZE_INLINING=y
10# CONFIG_SLAB is not set 10# CONFIG_SLAB is not set
11# CONFIG_SLUB is not set 11# CONFIG_SLUB is not set
12CONFIG_SLOB=y 12CONFIG_SLOB=y
13CONFIG_CC_STACKPROTECTOR_NONE=y
14# CONFIG_CC_STACKPROTECTOR_REGULAR is not set
15# CONFIG_CC_STACKPROTECTOR_STRONG is not set
16# CONFIG_CC_STACKPROTECTOR_AUTO is not set