common.opt (fstack-protector): Initialize to -1.
authorMagnus Granberg <zorry@gentoo.org>
Wed, 19 Aug 2015 22:07:06 +0000 (22:07 +0000)
committerJeff Law <law@gcc.gnu.org>
Wed, 19 Aug 2015 22:07:06 +0000 (16:07 -0600)
       * common.opt (fstack-protector): Initialize to -1.
        (fstack-protector-all): Likewise.
        (fstack-protector-strong): Likewise.
        (fstack-protector-explicit): Likewise.
        * configure.ac: Add --enable-default-ssp.
        * defaults.h (DEFAULT_FLAG_SSP): New.  Default SSP to strong.
        * opts.c (finish_options): Update opts->x_flag_stack_protect if it is
        -1.
        * doc/install.texi: Document --enable-default-ssp.
        * config.in: Regenerated.
        * configure: Likewise.

        * lib/target-supports.exp
        (check_effective_target_fstack_protector_enabled): New test.
        * gcc.target/i386/ssp-default.c: New test.

From-SVN: r227017

gcc/ChangeLog
gcc/common.opt
gcc/config.in
gcc/configure
gcc/configure.ac
gcc/defaults.h
gcc/doc/install.texi
gcc/opts.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/ssp-default.c [new file with mode: 0644]
gcc/testsuite/lib/target-supports.exp

index 567d440fd6839e9a58c0fc87bff52639ea6d6ee5..14446bc67955f1e1c82c06f14ef52ec6c0370a53 100644 (file)
@@ -1,3 +1,17 @@
+2015-08-19  Magnus Granberg  <zorry@gentoo.org>
+
+       * common.opt (fstack-protector): Initialize to -1.
+       (fstack-protector-all): Likewise.
+       (fstack-protector-strong): Likewise.
+       (fstack-protector-explicit): Likewise.
+       * configure.ac: Add --enable-default-ssp.
+       * defaults.h (DEFAULT_FLAG_SSP): New.  Default SSP to strong.
+       * opts.c (finish_options): Update opts->x_flag_stack_protect if it is
+       -1.
+       * doc/install.texi: Document --enable-default-ssp.
+       * config.in: Regenerated.
+       * configure: Likewise.
+
 2015-08-19  Alexandre Oliva <aoliva@redhat.com>
 
        PR rtl-optimization/64164
index dd59ff337e62255e9054a8d3c4183c8211629e1f..4dcd51807af5edb4b3e43874a7cfcb2a1e41cd24 100644 (file)
@@ -2124,15 +2124,15 @@ Common RejectNegative Joined Var(common_deferred_options) Defer
 -fstack-limit-symbol=<name>    Trap if the stack goes past symbol <name>
 
 fstack-protector
-Common Report Var(flag_stack_protect, 1)
+Common Report Var(flag_stack_protect, 1) Init(-1)
 Use propolice as a stack protection method
 
 fstack-protector-all
-Common Report RejectNegative Var(flag_stack_protect, 2)
+Common Report RejectNegative Var(flag_stack_protect, 2) Init(-1)
 Use a stack protection method for every function
 
 fstack-protector-strong
-Common Report RejectNegative Var(flag_stack_protect, 3)
+Common Report RejectNegative Var(flag_stack_protect, 3) Init(-1)
 Use a smart stack protection method for certain functions
 
 fstack-protector-explicit
index 541963a727a23eb1f598263a146760c77e4520bb..22a4e6b7cb22bd7fc3cc6cc52661c1ac5c12e42a 100644 (file)
 #endif
 
 
+/* Define if your target supports default stack protector and it is enabled.
+   */
+#ifndef USED_FOR_TARGET
+#undef ENABLE_DEFAULT_SSP
+#endif
+
+
 /* Define if you want more run-time sanity checks for dataflow. */
 #ifndef USED_FOR_TARGET
 #undef ENABLE_DF_CHECKING
index 8e89dd9c6ebb39b56915e9133d243efbbc179eb2..cf685f29ea6eacfb9844bae5af93c2de97676967 100755 (executable)
@@ -678,6 +678,7 @@ MAINT
 zlibinc
 zlibdir
 HOST_LIBS
+enable_default_ssp
 libgcc_visibility
 gcc_cv_readelf
 gcc_cv_objdump
@@ -930,6 +931,7 @@ enable_fix_cortex_a53_843419
 with_glibc_version
 enable_gnu_unique_object
 enable_linker_build_id
+enable_default_ssp
 with_long_double_128
 with_gc
 with_system_zlib
@@ -1666,6 +1668,7 @@ Optional Features:
                           extension on glibc systems
   --enable-linker-build-id
                           compiler will always pass --build-id to linker
+  --enable-default-ssp    enable Stack Smashing Protection as default
   --enable-maintainer-mode
                           enable make rules and dependencies not useful (and
                           sometimes confusing) to the casual installer
@@ -18341,7 +18344,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 18344 "configure"
+#line 18347 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -18447,7 +18450,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 18450 "configure"
+#line 18453 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -28047,6 +28050,29 @@ $as_echo "#define TARGET_LIBC_PROVIDES_SSP 1" >>confdefs.h
 
 fi
 
+# Check whether --enable-default-ssp was given.
+# Check whether --enable-default-ssp was given.
+if test "${enable_default_ssp+set}" = set; then :
+  enableval=$enable_default_ssp;
+if test x$gcc_cv_libc_provides_ssp = xyes; then
+  case "$target" in
+    ia64*-*-*) enable_default_ssp=no ;;
+    *) enable_default_ssp=$enableval ;;
+  esac
+else
+  enable_default_ssp=no
+fi
+else
+  enable_default_ssp=no
+fi
+
+if test x$enable_default_ssp == xyes ; then
+
+$as_echo "#define ENABLE_DEFAULT_SSP 1" >>confdefs.h
+
+fi
+
+
 # Test for <sys/sdt.h> on the target.
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking sys/sdt.h in the target C library" >&5
index c7d5d327a2e0f3819270d11a7f25818bad8a4229..d3c1449516d08097586fd896590a1379112f9e5d 100644 (file)
@@ -5329,6 +5329,25 @@ if test x$gcc_cv_libc_provides_ssp = xyes; then
            [Define if your target C library provides stack protector support])
 fi
 
+# Check whether --enable-default-ssp was given.
+AC_ARG_ENABLE(default-ssp,
+[AS_HELP_STRING([--enable-default-ssp],
+  [enable Stack Smashing Protection as default])],[
+if test x$gcc_cv_libc_provides_ssp = xyes; then
+  case "$target" in
+    ia64*-*-*) enable_default_ssp=no ;;
+    *) enable_default_ssp=$enableval ;;
+  esac
+else
+  enable_default_ssp=no
+fi],
+enable_default_ssp=no)
+if test x$enable_default_ssp == xyes ; then
+  AC_DEFINE(ENABLE_DEFAULT_SSP, 1,
+      [Define if your target supports default stack protector and it is enabled.])
+fi
+AC_SUBST([enable_default_ssp])
+
 # Test for <sys/sdt.h> on the target.
 GCC_TARGET_TEMPLATE([HAVE_SYS_SDT_H])
 AC_MSG_CHECKING(sys/sdt.h in the target C library)
index 713ca077c79f8beea605aa23bfad26d769c3f2fa..4fe8eb17f48289aa3802fbc22970f26372c45b4c 100644 (file)
@@ -1359,6 +1359,18 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #define STACK_SIZE_MODE word_mode
 #endif
 
+/* Default value for flag_stack_protect when flag_stack_protect is initialized to -1:
+   --enable-default-ssp: Default flag_stack_protect to -fstack-protector-strong.
+   --disable-default-ssp: Default flag_stack_protect to 0.
+ */
+#ifdef ENABLE_DEFAULT_SSP
+# ifndef DEFAULT_FLAG_SSP
+#  define DEFAULT_FLAG_SSP 3
+# endif
+#else
+# define DEFAULT_FLAG_SSP 0
+#endif
+
 /* Provide default values for the macros controlling stack checking.  */
 
 /* The default is neither full builtin stack checking...  */
index 360b0666b6980b8de6d2aca257b877ac15731ed9..6ba0fb97058bc33961f3ee19d27463cc285bc334 100644 (file)
@@ -1642,6 +1642,9 @@ Using the GNU Compiler Collection (GCC)},
 See ``RS/6000 and PowerPC Options'' in the main manual
 @end ifhtml
 
+@item --enable-default-ssp
+Turn on @option{-fstack-protector-strong} by default.
+
 @item --enable-cld
 This option enables @option{-mcld} by default for 32-bit x86 targets.
 @ifnothtml
index 32de605314fad1b24d52d688c0bb27487c4167a4..f1a9acd7ba04af2b6868ca25ce031ee2b7f1b360 100644 (file)
@@ -754,6 +754,11 @@ finish_options (struct gcc_options *opts, struct gcc_options *opts_set,
       opts->x_flag_opts_finished = true;
     }
 
+  /* We initialize opts->x_flag_stack_protect to -1 so that targets
+     can set a default value.  */
+  if (opts->x_flag_stack_protect == -1)
+    opts->x_flag_stack_protect = DEFAULT_FLAG_SSP;
+
   if (opts->x_optimize == 0)
     {
       /* Inlining does not work if not optimizing,
index e162dd26d782188dd4ef3016a037458c129902b5..9654cc340892b9d565948d2b95fd55185c1e5e2b 100644 (file)
@@ -1,3 +1,9 @@
+2015-08-19  Magnus Granberg  <zorry@gentoo.org>
+
+       * lib/target-supports.exp
+       (check_effective_target_fstack_protector_enabled): New test.
+       * gcc.target/i386/ssp-default.c: New test.
+
 2015-08-19  Mikael Morin  <mikael@gcc.gnu.org>
 
        PR fortran/66929
diff --git a/gcc/testsuite/gcc.target/i386/ssp-default.c b/gcc/testsuite/gcc.target/i386/ssp-default.c
new file mode 100644 (file)
index 0000000..3f65ed8
--- /dev/null
@@ -0,0 +1,22 @@
+/* { dg-do run { target native } } */
+/* { dg-require-effective-target fstack_protector_enabled } */
+
+#include <stdlib.h>
+
+void
+__stack_chk_fail (void)
+{
+  exit (0); /* pass */
+}
+
+int main ()
+{
+  int i;
+  char foo[255];
+
+  /* smash stack */
+  for (i = 0; i <= 400; i++)
+    foo[i] = 42;
+
+  return 1; /* fail */
+}
index 1988301045b6cfb93a7388930906c4ef7540e230..b6551e834d0ec7652b16dcb887153587f3e33bb1 100644 (file)
@@ -1145,6 +1145,17 @@ proc check_effective_target_pie_enabled { } {
     }]
 }
 
+# Return 1 if the target generates -fstack-protector by default.
+
+proc check_effective_target_fstack_protector_enabled {} {
+    return [ check_no_compiler_messages fstack_protector_enabled assembly {
+    #if !defined(__SSP__) && !defined(__SSP_ALL__) && \
+      !defined(__SSP_STRONG__) && !defined(__SSP_EXPICIT__)
+    #error unsupported
+    #endif
+    }]
+}
+
 # Return 1 if the target does not use a status wrapper.
 
 proc check_effective_target_unwrapped { } {