aboutsummaryrefslogtreecommitdiff
blob: 8b4c72eb5a7ceecdf872d65c81d914118f78624a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
2012-10-04	Magnus Granberg		<zorry@gentoo.org>

		* configure.ac		Add --enable-esp.  Add -fno-stack-protector
		to stage1_cflags.
		* gcc/configure.ac		Add --enable-esp and check if SSP works.
		Define ENABLE_ESP ENABLE_ESP_SSP.
		Check if we support crtbeginP and define ENABLE_CRTBEGINP.

--- a/configure.ac	2011-11-29 22:36:43.000000000 +0100
+++ b/configure.ac	2011-12-07 23:29:26.125712475 +0100
@@ -419,6 +419,25 @@ if test "${ENABLE_LIBADA}" != "yes" ; th
   noconfigdirs="$noconfigdirs gnattools"
 fi
 
+# Check whether --enable-esp was given and target have the support.
+AC_ARG_ENABLE([esp],
+[AS_HELP_STRING([--enable-esp],
+               [Enable Stack protector and Position independent executable as
+                default if we have suppot for it when compiling
+                and link with -z relro and -z now as default.
+                Linux targets supported i*86, x86_64, x32, powerpc, powerpc64, ia64 and arm.])],
+[
+  case $target in
+    i?86*-*-linux* | x86_64-*-linux* | powerpc-*-linux* | powerpc64-*-linux* | arm*-*-linux* | ia64-*-linux*)
+      enable_esp=yes
+      ;;
+    *)
+      AC_MSG_WARN([*** --enable-esp is not supported on this $target target.])
+      ;;
+  esac
+])
+AC_SUBST([enable_esp])
+
 AC_ARG_ENABLE(libssp,
 [AS_HELP_STRING([--enable-libssp], [build libssp directory])],
 ENABLE_LIBSSP=$enableval,
@@ -3211,6 +3230,11 @@ if test "$GCC" = yes -a "$ENABLE_BUILD_W
   CFLAGS="$saved_CFLAGS"
 fi
 
+# Disable -fstack-protector on stage1
+if test x$enable_esp = xyes; then
+  stage1_cflags="$stage1_cflags -fno-stack-protector"
+fi
+
 AC_SUBST(stage1_cflags)
 
 # Enable --enable-checking in stage1 of the compiler.
--- a/gcc/configure.ac	2011-11-18 11:52:32.000000000 +0100
+++ b/gcc/configure.ac	2012-10-02 17:39:15.649526241 +0200
@@ -5130,6 +5237,85 @@ if test x"${LINKER_HASH_STYLE}" != x; th
                                          [The linker hash style])
 fi
 
+# --------------
+# Esp checks
+# --------------
+
+# Check whether --enable-esp was given and target have the support.
+AC_ARG_ENABLE([esp],
+[AS_HELP_STRING([--enable-esp],
+               [Enable Stack protector and Position independent executable as
+                default if we have suppot for it when compiling
+                and link with -z relro and -z now as default.
+                Linux targets supported i*86, x86_64, x32, powerpc, powerpc64, ia64 and arm.])],
+  enable_esp=$enableval,
+  enable_esp=no)
+if test $enable_esp = yes ; then
+  AC_MSG_CHECKING(if $target support esp)
+  case "$target" in
+    i?86*-*-linux* | x86_64-*-linux* | powerpc-*-linux* | powerpc64-*-linux* | arm*-*-linux* | ia64-*-linux*)
+      enable_esp=yes
+      AC_DEFINE(ENABLE_ESP, 1,
+        [Define if your target support esp and you have enable it.])
+      ;;
+    *)
+      enable_esp=no
+      ;;
+  esac
+AC_MSG_RESULT($enable_esp)
+fi
+AC_SUBST([enable_esp])
+if test $enable_esp = yes ; then
+ AC_MSG_CHECKING(if we can default to use -fstack-protector-all)
+  ssp_link_test=no
+  if test x$gcc_cv_libc_provides_ssp = xyes && test x$set_have_as_tls = xyes; then
+    if $EGREP '^ 	*#[ 	]*define[ 	]+__UCLIBC__[ 	]+1' \
+      $target_header_dir/features.h > /dev/null; then
+        if test -f $target_header_dir/bits/uClibc_config.h && \
+          $EGREP '^ 	*#[ 	]*define[ 	]+__UCLIBC_SUBLEVEL__[ 	]+([3-9][2-9]|[4-9][0-9])' \
+          $target_header_dir/bits/uClibc_config.h > /dev/null && \
+          $EGREP '^ 	*#[ 	]*define[ 	]+__UCLIBC_HAS_TLS__[ 	]+1' \
+          $target_header_dir/bits/uClibc_config.h > /dev/null; then
+            ssp_link_test=yes
+        fi
+    else
+      ssp_link_test=yes
+    fi
+  fi
+  if test x$ssp_link_test=xyes ; then
+    saved_CFLAGS="$CFLAGS"
+    CFLAGS="$CFLAGS -O2 -fstack-protector-all -Werror"
+    AC_TRY_LINK(,,
+      [AC_MSG_RESULT([yes]); enable_esp_ssp=yes],
+      [AC_MSG_RESULT([no]); enable_esp_ssp=no])
+    CFLAGS="$saved_CFLAGS"
+  else
+    enable_esp_ssp=no
+    AC_MSG_RESULT($enable_esp_ssp)
+  fi
+  if test $enable_esp_ssp = yes ; then
+    AC_DEFINE(ENABLE_ESP_SSP, 1,
+      [Define if your compiler will default to use -fstack-protector-all.])
+  fi
+  AC_MSG_CHECKING(checking for crtbeginP.o support)
+    if test x$enable_esp = xyes ; then
+      case "$target" in
+        ia64*-*-linux*)
+          enable_crtbeginP=no ;;
+        *-*-linux*)
+          if test x$gcc_cv_ld_pie = xyes && test x$lt_cv_prog_compiler_static_works = xyes; then
+            enable_crtbeginP=yes
+            AC_DEFINE(ENABLE_CRTBEGINP, 1,
+              [Define if your compiler will support crtbeginP.])
+          fi
+          ;;
+        *) enable_crtbeginP=no ;;
+      esac
+    fi
+  AC_MSG_RESULT($enable_crtbeginP)
+fi
+AC_SUBST([enable_crtbeginP])
+
 # Configure the subdirectories
 # AC_CONFIG_SUBDIRS($subdirs)