]> git.ipfire.org Git - ipfire-3.x.git/blame - gcc/patches/gcc-4.6.0-piepatches-20110407.patch
Move all packages to root.
[ipfire-3.x.git] / gcc / patches / gcc-4.6.0-piepatches-20110407.patch
CommitLineData
3c926509
MT
1diff -Nur gcc-4.6.0-vanilla/configure gcc-4.6.0/configure
2--- gcc-4.6.0-vanilla/configure 2011-03-16 19:27:36.000000000 +0100
3+++ gcc-4.6.0/configure 2011-04-07 19:17:55.383923352 +0200
4@@ -668,6 +668,7 @@
5 CFLAGS
6 CC
7 target_subdir
8+enable_esp
9 host_subdir
10 build_subdir
11 build_libsubdir
12@@ -1459,6 +1460,11 @@
13 --disable-libquadmath-support
14 disable libquadmath support for Fortran
15 --enable-libada build libada directory
16+ --enable-esp
17+ Enable Stack protector, Position independent executable as
18+ default if we have suppot for it when compiling
19+ and link with -z relro and -z now as default.
20+ Linux targets supported i*86, x86_64, powerpc, powerpc64, ia64 and arm
21 --enable-libssp build libssp directory
22 --enable-build-with-cxx build with C++ compiler instead of C compiler
23 --disable-ppl-version-check
24@@ -3040,6 +3046,25 @@
25 noconfigdirs="$noconfigdirs gnattools"
26 fi
27
28+# Check whether --enable-esp was given and target have the support.
29+# Check whether --enable-esp or --disable-esp was given.
30+if test "${enable_esp+set}" = set; then
31+ enableval="$enable_esp"
32+
33+ case $target in
34+ i?86*-*-linux* | x86_64*-*-linux* | powerpc-*-linux* | powerpc64-*-linux* | arm*-*-linux* | ia64-*-linux*)
35+ enable_esp=yes
36+ ;;
37+ *)
38+ { { echo "$as_me:$LINENO: error: *** --enable-esp is not supported on this $target target." >&5
39+echo "$as_me: error: *** --enable-esp is not supported on this $target target." >&2;}
40+ { (exit 1); exit 1; }; }
41+ ;;
42+ esac
43+
44+fi;
45+
46+
47 # Check whether --enable-libssp was given.
48 if test "${enable_libssp+set}" = set; then :
49 enableval=$enable_libssp; ENABLE_LIBSSP=$enableval
50@@ -14199,6 +14224,9 @@
51 *) stage1_cflags="-g -J" ;;
52 esac ;;
53 esac
54+if test x$enable_esp = xyes; then
55+ stage1_cflags="$stage1_cflags -fno-stack-protector"
56+fi
57
58 # This is aimed to mimic bootstrap with a non-GCC compiler to catch problems.
59 if test "$GCC" = yes -a "$ENABLE_BUILD_WITH_CXX" != yes; then
60diff -Nur gcc-4.6.0-vanilla/gcc/config/gnu-user.h gcc-4.6.0/gcc/config/gnu-user.h
61--- gcc-4.6.0-vanilla/gcc/config/gnu-user.h 2011-01-12 15:29:14.000000000 +0100
62+++ gcc-4.6.0/gcc/config/gnu-user.h 2011-04-07 19:19:31.962715700 +0200
63@@ -41,7 +41,11 @@
64 provides part of the support for getting C++ file-scope static
65 object constructed before entering `main'. */
66
67-#if defined HAVE_LD_PIE
68+#if defined (HAVE_LD_PIE) && defined (ENABLE_CRTBEGINTS)
69+#define GNU_USER_TARGET_STARTFILE_SPEC \
70+ "%{!shared: %{pg|p|profile:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}} crti.o%s \
71+ %{static:%{pie:crtbeginTS.o%s;:crtbeginT.o%s}} %{!static:%{shared|pie:crtbeginS.o%s;:crtbegin.o%s}}"
72+#elif defined (HAVE_LD_PIE) && ! defined (ENABLE_CRTBEGINTS)
73 #define GNU_USER_TARGET_STARTFILE_SPEC \
74 "%{!shared: %{pg|p|profile:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}} \
75 crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
76diff -Nur gcc-4.6.0-vanilla/gcc/config/rs6000/linux64.h gcc-4.6.0/gcc/config/rs6000/linux64.h
77--- gcc-4.6.0-vanilla/gcc/config/rs6000/linux64.h 2011-03-07 08:50:23.000000000 +0100
78+++ gcc-4.6.0/gcc/config/rs6000/linux64.h 2011-04-07 19:19:26.658727069 +0200
79@@ -193,7 +193,7 @@
80 #endif
81
82 #define ASM_SPEC32 "-a32 \
83-%{mrelocatable} %{mrelocatable-lib} %{fpic:-K PIC} %{fPIC:-K PIC} \
84+%{mrelocatable} %{mrelocatable-lib} %{fpic|fPIC|fpie|fPIE:-K PIC} \
85 %{memb} %{!memb: %{msdata=eabi: -memb}} \
86 %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: \
87 %{mcall-freebsd: -mbig} \
88diff -Nur gcc-4.6.0-vanilla/gcc/config/rs6000/sysv4.h gcc-4.6.0/gcc/config/rs6000/sysv4.h
89--- gcc-4.6.0-vanilla/gcc/config/rs6000/sysv4.h 2011-03-07 08:50:23.000000000 +0100
90+++ gcc-4.6.0/gcc/config/rs6000/sysv4.h 2011-04-07 19:19:31.963715695 +0200
91@@ -800,7 +800,12 @@
92 %{!mnewlib: %{pthread:-lpthread} %{shared:-lc} \
93 %{!shared: %{profile:-lc_p} %{!profile:-lc}}}"
94
95-#ifdef HAVE_LD_PIE
96+#if defined (HAVE_LD_PIE) && defined (ENABLE_CRTBEGINTS)
97+#define STARTFILE_LINUX_SPEC "\
98+%{!shared: %{pg|p|profile:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}} \
99+%{mnewlib:ecrti.o%s;:crti.o%s} \
100+%{static:%{pie:crtbeginTS.o%s;:crtbeginT.o%s}} %{!static:%{shared|pie:crtbeginS.o%s;:crtbegin.o%s}}"
101+#elif defined (HAVE_LD_PIE) && ! defined (ENABLE_CRTBEGINTS)
102 #define STARTFILE_LINUX_SPEC "\
103 %{!shared: %{pg|p|profile:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}} \
104 %{mnewlib:ecrti.o%s;:crti.o%s} \
105diff -Nur gcc-4.6.0-vanilla/gcc/config.in gcc-4.6.0/gcc/config.in
106--- gcc-4.6.0-vanilla/gcc/config.in 2011-03-25 18:07:00.000000000 +0100
107+++ gcc-4.6.0/gcc/config.in 2011-04-07 19:18:10.478890819 +0200
108@@ -58,6 +58,12 @@
109 #endif
110
111
112+/* Define to 1 to enable crtbeginTS.o. */
113+#ifndef USED_FOR_TARGET
114+#undef ENABLE_CRTBEGINTS
115+#endif
116+
117+
118 /* Define to 1 to specify that we are using the BID decimal floating point
119 format instead of DPD */
120 #ifndef USED_FOR_TARGET
121@@ -77,6 +83,12 @@
122 #endif
123
124
125+/* Define to 1 to enable esp. */
126+#ifndef USED_FOR_TARGET
127+#undef ENABLE_ESP
128+#endif
129+
130+
131 /* Define to 1 to enable fixed-point arithmetic extension to C. */
132 #ifndef USED_FOR_TARGET
133 #undef ENABLE_FIXED_POINT
134diff -Nur gcc-4.6.0-vanilla/gcc/configure gcc-4.6.0/gcc/configure
135--- gcc-4.6.0-vanilla/gcc/configure 2011-02-28 16:36:37.000000000 +0100
136+++ gcc-4.6.0/gcc/configure 2011-04-07 19:17:55.388923340 +0200
137@@ -677,6 +677,8 @@
138 HOST_LIBS
139 GGC
140 libgcc_visibility
141+enable_esp
142+enable_crtbeginTS
143 gcc_cv_readelf
144 gcc_cv_objdump
145 ORIGINAL_NM_FOR_TARGET
146@@ -25608,6 +25610,50 @@
147 ;;
148 esac
149
150+echo "$as_me:$LINENO: checking linker -z now support" >&5
151+echo $ECHO_N "checking linker -z now support... $ECHO_C" >&6
152+if test "${gcc_cv_ld_now+set}" = set; then
153+ echo $ECHO_N "(cached) $ECHO_C" >&6
154+else
155+ gcc_cv_ld_now=no
156+if test $in_tree_ld = yes ; then
157+ if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" -ge 16 -o "$gcc_cv_gld_major_version" -gt 2 \
158+ && test $in_tree_ld_is_elf = yes; then
159+ gcc_cv_ld_now=yes
160+ fi
161+elif test x$gcc_cv_ld != x; then
162+ # Check if linker supports -z now options
163+ if $gcc_cv_ld --help 2>/dev/null | grep now > /dev/null; then
164+ gcc_cv_ld_now=yes
165+ fi
166+fi
167+
168+fi
169+echo "$as_me:$LINENO: result: $gcc_cv_ld_now" >&5
170+echo "${ECHO_T}$gcc_cv_ld_now" >&6
171+
172+echo "$as_me:$LINENO: checking linker -z relro support" >&5
173+echo $ECHO_N "checking linker -z relro support... $ECHO_C" >&6
174+if test "${gcc_cv_ld_relro+set}" = set; then
175+ echo $ECHO_N "(cached) $ECHO_C" >&6
176+else
177+ gcc_cv_ld_relro=no
178+if test $in_tree_ld = yes ; then
179+ if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" -ge 16 -o "$gcc_cv_gld_major_version" -gt 2 \
180+ && test $in_tree_ld_is_elf = yes; then
181+ gcc_cv_ld_relro=yes
182+ fi
183+elif test x$gcc_cv_ld != x; then
184+ # Check if linker supports -z relro and -z norelro options
185+ if $gcc_cv_ld --help 2>/dev/null | grep relro > /dev/null; then
186+ gcc_cv_ld_relro=yes
187+ fi
188+fi
189+
190+fi
191+echo "$as_me:$LINENO: result: $gcc_cv_ld_relro" >&5
192+echo "${ECHO_T}$gcc_cv_ld_relro" >&6
193+
194 { $as_echo "$as_me:${as_lineno-$LINENO}: checking linker --build-id support" >&5
195 $as_echo_n "checking linker --build-id support... " >&6; }
196 if test "${gcc_cv_ld_buildid+set}" = set; then :
197@@ -25792,6 +25838,74 @@
198
199 fi
200
201+if test x$enable_esp = xyes ; then
202+case $target in
203+ ia64*-*-linux*)
204+ if test x$gcc_cv_ld_now = xyes; then
205+ enable_esp_ld=yes
206+ else
207+ enable_esp_ld=no
208+ fi
209+ ;;
210+ *-*-linux*)
211+ if test x$gcc_cv_ld_relro = xyes && test x$gcc_cv_ld_now = xyes; then
212+ enable_esp_ld=yes
213+ else
214+ enable_esp_ld=no
215+ fi
216+ ;;
217+ *)
218+ enable_esp_ld=no
219+ ;;
220+ esac
221+else
222+ enable_espf_ld=no
223+fi
224+if test x$enable_esp_ld = xyes; then
225+
226+cat >>confdefs.h <<\_ACEOF
227+#define ENABLE_ESP 1
228+_ACEOF
229+
230+fi
231+
232+if test x$enable_esp = xyes && test x$enable_esp_ld = xno; then
233+ { { echo "$as_me:$LINENO: error: *** --enable-esp is not supported. You don't have -z,relro or -z,now support in the linker." >&5
234+echo "$as_me: error: *** --enable-esp is not supported. You don't have -z,relro or -z,now support in the linker." >&2;}
235+ { (exit 1); exit 1; }; }
236+fi
237+
238+echo "$as_me:$LINENO: checking for crtbeginTS.o support" >&5
239+echo $ECHO_N "checking for crtbeginTS.o support... $ECHO_C" >&6
240+if test "${enable_crtbeginTS+set}" = set; then
241+ echo $ECHO_N "(cached) $ECHO_C" >&6
242+else
243+
244+if test x$enable_esp = xyes ; then
245+ case "$target" in
246+ ia64*-*-linux*)
247+ enable_crtbeginTS=no ;;
248+ *-*-linux*)
249+ if test x$gcc_cv_ld_pie = xyes && test x$lt_cv_prog_compiler_static_works = xyes; then
250+ enable_crtbeginTS=yes
251+ fi
252+ ;;
253+ *) enable_crtbeginTS=no ;;
254+ esac
255+fi
256+
257+fi
258+echo "$as_me:$LINENO: result: $enable_crtbeginTS" >&5
259+echo "${ECHO_T}$enable_crtbeginTS" >&6
260+
261+if test x$enable_crtbeginTS = xyes; then
262+
263+cat >>confdefs.h <<\_ACEOF
264+#define ENABLE_CRTBEGINTS 1
265+_ACEOF
266+
267+fi
268+
269 # Check if TFmode long double should be used by default or not.
270 # Some glibc targets used DFmode long double, but with glibc 2.4
271 # and later they can use TFmode.
272diff -Nur gcc-4.6.0-vanilla/gcc/cp/lang-specs.h gcc-4.6.0/gcc/cp/lang-specs.h
273--- gcc-4.6.0-vanilla/gcc/cp/lang-specs.h 2011-03-06 17:27:57.000000000 +0100
274+++ gcc-4.6.0/gcc/cp/lang-specs.h 2011-04-07 19:19:04.828773916 +0200
275@@ -47,7 +47,7 @@
276 %(cpp_options) %2 -o %{save-temps*:%b.ii} %{!save-temps*:%g.ii} \n}\
277 cc1plus %{save-temps*|no-integrated-cpp:-fpreprocessed %{save-temps*:%b.ii} %{!save-temps*:%g.ii}}\
278 %{!save-temps*:%{!no-integrated-cpp:%(cpp_unique_options)}}\
279- %(cc1_options) %2\
280+ %(cc1_options) %(esp_options) %2\
281 %{!fsyntax-only:%{!fdump-ada-spec*:-o %g.s %{!o*:--output-pch=%i.gch}\
282 %W{o*:--output-pch=%*}}%V}}}}",
283 CPLUSPLUS_CPP_SPEC, 0, 0},
284@@ -58,7 +58,7 @@
285 %(cpp_options) %2 -o %{save-temps*:%b.ii} %{!save-temps*:%g.ii} \n}\
286 cc1plus %{save-temps*|no-integrated-cpp:-fpreprocessed %{save-temps*:%b.ii} %{!save-temps*:%g.ii}}\
287 %{!save-temps*:%{!no-integrated-cpp:%(cpp_unique_options)}}\
288- %(cc1_options) %2\
289+ %(cc1_options) %(esp_options) %2\
290 %{!fsyntax-only:%(invoke_as)}}}}",
291 CPLUSPLUS_CPP_SPEC, 0, 0},
292 {".ii", "@c++-cpp-output", 0, 0, 0},
293diff -Nur gcc-4.6.0-vanilla/gcc/esp.h gcc-4.6.0/gcc/esp.h
294--- gcc-4.6.0-vanilla/gcc/esp.h 1970-01-01 01:00:00.000000000 +0100
295+++ gcc-4.6.0/gcc/esp.h 2011-04-07 19:19:14.329753502 +0200
296@@ -0,0 +1,145 @@
297+/* License terms see GNU GENERAL PUBLIC LICENSE Version 3.
298+ * Version 20100527.1
299+ * Magnus Granberg (Zorry) <zorry@gentoo.org> */
300+#ifndef GCC_ESP_H
301+#define GCC_ESP_H
302+
303+/* This file will add -fstack-protector-all, -fPIE, -pie and -z now
304+ as default if the defines and the spec allow it.
305+ Added a hack for gcc-specs-* in toolchain-funcs.eclass and _filter-hardened in flag-o-matic.eclass
306+ to support older hardened GCC patches and we don't need to change the code on gcc-specs-* and _filter-hardened.
307+ This will add some unsupported upstream commands options as -nopie and -nonow.
308+ -D__KERNEL__ is added so we don't have -fPIE, -pie and -fstack-protector-all when building kernels.
309+ ESP_CC1_SPEC is added to CC1_SPEC.
310+ ESP_CC1_STRICT_OVERFLOW_SPEC is added so we don't disable the strict-overflow check.
311+ ESP_LINK_PIE_CHECK_SPEC check for -pie, -p, -pg, -profile and -static.
312+ ENABLE_CRTBEGINTS add support for crtbeginTS.o, build -static with -fPIE or -fpie.
313+*/
314+#ifdef ENABLE_ESP
315+
316+ /* Hack to support gcc-specs-* in toolchain-funcs.eclass and _filter-hardened in flag-o-matic.eclass */
317+ #define ESP_CC1_SPEC " %(esp_cc1_ssp) %(esp_cc1_pie) %(esp_cc1_strict_overflow)"
318+ #if defined ( EFAULT_SSP ) || defined ( EFAULT_PIE_SSP )
319+ #define ESP_CC1_SSP_SPEC "%{!fno-stack-protector: %{!fno-stack-protector-all: }}"
320+ #else
321+ #define ESP_CC1_SSP_SPEC ""
322+ #endif
323+ #if defined ( EFAULT_PIE ) || defined ( EFAULT_PIE_SSP )
324+ #define ESP_CC1_PIE_SPEC "%{!nopie: }"
325+ #else
326+ #define ESP_CC1_PIE_SPEC ""
327+ #endif
328+ #define ESP_CC1_STRICT_OVERFLOW_SPEC "%{!fstrict-overflow:%{!fno-strict-overflow: -fno-strict-overflow}}"
329+
330+ /* ESP_LINK_SPEC is added to LINK_PIE_SPEC if esp is enable
331+ -z now will be added if we don't have -vanilla spec. We do a -pie incompatible check
332+ Don't remove the specs in the end */
333+ #define ESP_LINK_SPEC "%(esp_link_now) %(esp_link_pie_check) "
334+ #define ESP_LINK_NOW_SPEC "%{!nonow:-z now}"
335+
336+ /* We use ESP_COMMAND_OPTIONS_SPEC to add pie command-line options. */
337+ #define ESP_COMMAND_OPTIONS_SPEC "%{!D__KERNEL__:%{!nopie:%(esp_options_pie) %(esp_link_pie)}}"
338+
339+ /* ESP_OPTIONS_SPEC is added to the compiler spec in gcc/gcc.c */
340+ #define ESP_OPTIONS_SPEC "%(esp_options_ssp)"
341+
342+ /* ESP_CPP_OPTIONS_SPEC is added to the cpp_options spec in gcc/gcc.c
343+ For precompiling headers. */
344+ #define ESP_CPP_OPTIONS_SPEC "%(esp_options_ssp)"
345+
346+ /* This will add -fstack-protector-all if we don't have -nostdlib -nodefaultlibs -fno-stack-protector -fstack-protector
347+ -fstack-protector-all and we have EFAULT_SSP or EFAULT_PIE_SSP defined. */
348+ #if defined ( EFAULT_SSP ) || defined ( EFAULT_PIE_SSP )
349+ #define ESP_OPTIONS_SSP_SPEC \
350+ "%{!D__KERNEL__:%{!nostdlib:%{!nodefaultlibs: %{!fno-stack-protector: \
351+ %{!fstack-protector:%{!fstack-protector-all:-fstack-protector-all}}}}}}"
352+ #else
353+ #define ESP_OPTIONS_SSP_SPEC ""
354+ #endif
355+
356+ /* If EFAULT_PIE or EFAULT_PIE_SSP is defined we will add -fPIE -pie */
357+ #if defined ( EFAULT_PIE ) || defined ( EFAULT_PIE_SSP )
358+
359+ /* This will add -fPIE if we don't have -pie -fpic -fPIC -fpie -fPIE -fno-pic -fno-PIC -fno-pie -fno-PIE -shared -static
360+ -nostdlib -nostartfiles. */
361+ /* With ENABLE_CRTBEGINTS we don't need to check for -static */
362+ #ifdef ENABLE_CRTBEGINTS
363+ #define ESP_OPTIONS_PIE_SPEC \
364+ "%{!pie: %{!fpic:%{!fPIC:%{!fpie:%{!fPIE: %{!fno-pic:%{!fno-PIC:%{!fno-pie:%{!fno-PIE: \
365+ %{!shared: %{!nostdlib: %{!nostartfiles:-fPIE}} } }}}} }}}} }"
366+ #else
367+ #define ESP_OPTIONS_PIE_SPEC \
368+ "%{!pie: %{!fpic:%{!fPIC:%{!fpie:%{!fPIE: %{!fno-pic:%{!fno-PIC:%{!fno-pie:%{!fno-PIE: \
369+ %{!shared: %{!static: %{!nostdlib: %{!nostartfiles:-fPIE}} } }}}} }}}} }}"
370+ #endif
371+
372+ /* This will add -pie if we don't have -pie -A -fno-pic -fno-PIC -fno-pie -fno-PIE -shared -static -r -nostdlib
373+ -nostartfiles */
374+ /* With ENABLE_CRTBEGINTS we don't need to check for -static
375+ and we add -pie only to get the start and endfiles. -pie will not go to the linker. */
376+ #ifdef ENABLE_CRTBEGINTS
377+ #define ESP_LINK_PIE_SPEC \
378+ "%{!pie:%{!A:%{!fno-pie:%{!fno-PIE:%{!fno-pic:%{!fno-PIC:%{!shared:%{!r: \
379+ %{!nostdlib:%{!nostartfiles:-pie}}}}}}}}}}"
380+ #else
381+ #define ESP_LINK_PIE_SPEC \
382+ "%{!pie:%{!A:%{!fno-pie:%{!fno-PIE:%{!fno-pic:%{!fno-PIC:%{!shared:%{!static:%{!r: \
383+ %{!nostdlib:%{!nostartfiles:-pie}}}}}}}}}}}"
384+ #endif
385+
386+ /* This will check if -pie is set when (-static) -pg -p -profile. If set it will make gcc print out
387+ "-pie and (static)|pg|p|profile are incompatible when linking" */
388+ /* With ENABLE_CRTBEGINTS we don't need to check for -static */
389+ #ifdef ENABLE_CRTBEGINTS
390+ #define ESP_LINK_PIE_CHECK_SPEC \
391+ "%{pie:%{pg|p|profile:%e-pie and -pg|p|profile are incompatible when linking}}"
392+ #else
393+ #define ESP_LINK_PIE_CHECK_SPEC \
394+ "%{pie:%{static|pg|p|profile:%e-pie and -static|pg|p|profile are incompatible when linking}}"
395+ #endif
396+
397+ /* We don't pass -pie to the linker when -static. */
398+ #ifdef ENABLE_CRTBEGINTS
399+ #define LINK_PIE_SPEC "%{!static:%{pie:-pie}} %(esp_link)"
400+ #else
401+ #define LINK_PIE_SPEC "%{pie:-pie} %(esp_link)"
402+ #endif
403+
404+ #else
405+ #define ESP_OPTIONS_PIE_SPEC ""
406+ #define ESP_LINK_PIE_CHECK_SPEC ""
407+ #define ESP_LINK_PIE_SPEC ""
408+ #define LINK_PIE_SPEC "%{pie:-pie} %(esp_link)"
409+ #endif
410+
411+ /* We add extra spec name's to the EXTRA_SPECS list */
412+ #define ESP_EXTRA_SPECS \
413+ { "esp_cc1", ESP_CC1_SPEC }, \
414+ { "esp_cc1_pie", ESP_CC1_PIE_SPEC }, \
415+ { "esp_cc1_ssp", ESP_CC1_SSP_SPEC }, \
416+ { "esp_cc1_strict_overflow", ESP_CC1_STRICT_OVERFLOW_SPEC }, \
417+ { "esp_link", ESP_LINK_SPEC }, \
418+ { "esp_link_now", ESP_LINK_NOW_SPEC }, \
419+ { "esp_link_pie", ESP_LINK_PIE_SPEC }, \
420+ { "esp_link_pie_check", ESP_LINK_PIE_CHECK_SPEC }, \
421+ { "esp_command_options", ESP_COMMAND_OPTIONS_SPEC }, \
422+ { "esp_cpp_options", ESP_CPP_OPTIONS_SPEC }, \
423+ { "esp_options", ESP_OPTIONS_SPEC }, \
424+ { "esp_options_pie", ESP_OPTIONS_PIE_SPEC }, \
425+ { "esp_options_ssp", ESP_OPTIONS_SSP_SPEC }
426+
427+ static const char *esp_command_options_spec = ESP_COMMAND_OPTIONS_SPEC;
428+ static const char *cc1_spec = CC1_SPEC ESP_CC1_SPEC;
429+
430+#else /* If not ESP_ENABLE defined do this. */
431+
432+ #define ESP_OPTIONS_SPEC ""
433+ #define ESP_CPP_OPTIONS_SPEC ""
434+
435+ /* We add extra spec name's to the EXTRA_SPECS list */
436+ #define ESP_EXTRA_SPECS \
437+ { "esp_options", ESP_OPTIONS_SPEC }, \
438+ { "esp_cpp_options", ESP_CPP_OPTIONS_SPEC }
439+
440+#endif
441+#endif /* End GCC_ESP_H */
442diff -Nur gcc-4.6.0-vanilla/gcc/gcc.c gcc-4.6.0/gcc/gcc.c
443--- gcc-4.6.0-vanilla/gcc/gcc.c 2011-02-23 03:04:43.000000000 +0100
444+++ gcc-4.6.0/gcc/gcc.c 2011-04-07 19:19:04.828773916 +0200
445@@ -44,6 +44,7 @@
446 #include "flags.h"
447 #include "opts.h"
448 #include "vec.h"
449+#include "esp.h" /* for --enable-esp support */
450
451 /* By default there is no special suffix for target executables. */
452 /* FIXME: when autoconf is fixed, remove the host check - dj */
453@@ -690,7 +691,9 @@
454
455 static const char *asm_debug;
456 static const char *cpp_spec = CPP_SPEC;
457+#ifndef ENABLE_ESP
458 static const char *cc1_spec = CC1_SPEC;
459+#endif
460 static const char *cc1plus_spec = CC1PLUS_SPEC;
461 static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC;
462 static const char *link_ssp_spec = LINK_SSP_SPEC;
463@@ -751,7 +754,7 @@
464 static const char *cpp_options =
465 "%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
466 %{f*} %{g*:%{!g0:%{g*} %{!fno-working-directory:-fworking-directory}}} %{O*}\
467- %{undef} %{save-temps*:-fpch-preprocess}";
468+ %{undef} %{save-temps*:-fpch-preprocess} %(esp_cpp_options)";
469
470 /* This contains cpp options which are not passed when the preprocessor
471 output will be used by another program. */
472@@ -925,9 +928,9 @@
473 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
474 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
475 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
476- %(cc1_options)}\
477+ %(cc1_options) %(esp_options)}\
478 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
479- cc1 %(cpp_unique_options) %(cc1_options)}}}\
480+ cc1 %(cpp_unique_options) %(cc1_options) %(esp_options)}}}\
481 %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 1},
482 {"-",
483 "%{!E:%e-E or -x required when input is from standard input}\
484@@ -950,7 +953,7 @@
485 %W{o*:--output-pch=%*}}%V}}}}}}", 0, 0, 0},
486 {".i", "@cpp-output", 0, 0, 0},
487 {"@cpp-output",
488- "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
489+ "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %(esp_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
490 {".s", "@assembler", 0, 0, 0},
491 {"@assembler",
492 "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 0, 0},
493@@ -1203,18 +1206,23 @@
494 INIT_STATIC_SPEC ("sysroot_hdrs_suffix_spec", &sysroot_hdrs_suffix_spec),
495 };
496
497-#ifdef EXTRA_SPECS /* additional specs needed */
498+/* EXTRA_SPECS needs to be defined */
499+#ifndef EXTRA_SPECS
500+#define EXTRA_SPECS
501+#endif
502+
503+/* EXTRA_SPECS and ESP_EXTRA_SPECS add additional specs */
504 /* Structure to keep track of just the first two args of a spec_list.
505- That is all that the EXTRA_SPECS macro gives us. */
506+ That is all that the EXTRA_SPECS and ESP_EXTRA_SPECS macro gives us. */
507 struct spec_list_1
508 {
509 const char *const name;
510 const char *const ptr;
511 };
512
513-static const struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS };
514+/* ESP_EXTRA_SPECS before EXTRA_SPECS */
515+static const struct spec_list_1 extra_specs_1[] = { ESP_EXTRA_SPECS, EXTRA_SPECS };
516 static struct spec_list *extra_specs = (struct spec_list *) 0;
517-#endif
518
519 /* List of dynamically allocates specs that have been defined so far. */
520
521@@ -1306,7 +1314,6 @@
522 if (verbose_flag)
523 fnotice (stderr, "Using built-in specs.\n");
524
525-#ifdef EXTRA_SPECS
526 extra_specs = XCNEWVEC (struct spec_list, ARRAY_SIZE (extra_specs_1));
527
528 for (i = ARRAY_SIZE (extra_specs_1) - 1; i >= 0; i--)
529@@ -1319,7 +1326,6 @@
530 sl->ptr_spec = &sl->ptr;
531 next = sl;
532 }
533-#endif
534
535 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
536 {
537@@ -6418,6 +6424,12 @@
538 gcc_exec_prefix = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
539 spec_version, dir_separator_str, NULL);
540
541+#ifdef ENABLE_ESP
542+ /* Process ESP_COMMAND_OPTIONS_SPEC, adding any new options to the end
543+ of the command line. */
544+ do_self_spec (esp_command_options_spec);
545+#endif
546+
547 /* Now we have the specs.
548 Set the `valid' bits for switches that match anything in any spec. */
549
550diff -Nur gcc-4.6.0-vanilla/gcc/Makefile.in gcc-4.6.0/gcc/Makefile.in
551--- gcc-4.6.0-vanilla/gcc/Makefile.in 2011-01-26 05:19:58.000000000 +0100
552+++ gcc-4.6.0/gcc/Makefile.in 2011-04-07 19:18:24.186861296 +0200
553@@ -642,6 +642,14 @@
554 INHIBIT_LIBC_CFLAGS = -Dinhibit_libc
555 endif
556
557+# We don't want to compile the compiler with -fPIE.
558+enable_esp = @enable_esp@
559+ifeq ($(enable_esp),yes)
560+ESP_NOPIE_CFLAGS = -fno-PIE
561+else
562+ESP_NOPIE_CFLAGS=
563+endif
564+
565 # Options to use when compiling libgcc2.a.
566 #
567 LIBGCC2_DEBUG_CFLAGS = -g
568@@ -662,7 +670,7 @@
569 CRTSTUFF_CFLAGS = -O2 $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -g0 \
570 -finhibit-size-directive -fno-inline -fno-exceptions \
571 -fno-zero-initialized-in-bss -fno-toplevel-reorder -fno-tree-vectorize \
572- -fno-stack-protector \
573+ -fno-stack-protector $(ESP_NOPIE_CFLAGS) \
574 $(INHIBIT_LIBC_CFLAGS)
575
576 # Additional sources to handle exceptions; overridden by targets as needed.
577@@ -693,6 +701,12 @@
578 # The rules for compiling them should be in the t-* file for the machine.
579 EXTRA_PARTS = @extra_parts@
580
581+# We add crtbeginTS.o to the EXTRA_PARTS list if enable_crtbeginTS = yes
582+enable_crtbeginTS = @enable_crtbeginTS@
583+ifeq ($(enable_crtbeginTS),yes)
584+EXTRA_PARTS += crtbeginTS.o
585+endif
586+
587 # List of extra object files that should be compiled and linked with
588 # compiler proper (cc1, cc1obj, cc1plus).
589 EXTRA_OBJS = @extra_objs@
590@@ -996,7 +1010,7 @@
591
592 # This is the variable actually used when we compile. If you change this,
593 # you probably want to update BUILD_CFLAGS in configure.ac
594-ALL_CFLAGS = $(T_CFLAGS) $(CFLAGS-$@) \
595+ALL_CFLAGS = $(ESP_NOPIE_CFLAGS) $(T_CFLAGS) $(CFLAGS-$@) \
596 $(CFLAGS) $(INTERNAL_CFLAGS) $(COVERAGE_FLAGS) $(WARN_CFLAGS) @DEFS@
597
598 # The C++ version.
599@@ -1920,9 +1934,10 @@
600 echo LIBGCC_SYNC = '$(LIBGCC_SYNC)' >> tmp-libgcc.mvars
601 echo LIBGCC_SYNC_CFLAGS = '$(LIBGCC_SYNC_CFLAGS)' >> tmp-libgcc.mvars
602 echo CRTSTUFF_CFLAGS = '$(CRTSTUFF_CFLAGS)' >> tmp-libgcc.mvars
603- echo CRTSTUFF_T_CFLAGS = '$(CRTSTUFF_T_CFLAGS)' >> tmp-libgcc.mvars
604+ echo CRTSTUFF_T_CFLAGS = '$(CRTSTUFF_T_CFLAGS) $(ESP_NOPIE_CFLAGS)' >> tmp-libgcc.mvars
605 echo CRTSTUFF_T_CFLAGS_S = '$(CRTSTUFF_T_CFLAGS_S)' >> tmp-libgcc.mvars
606 echo TARGET_SYSTEM_ROOT = '$(TARGET_SYSTEM_ROOT)' >> tmp-libgcc.mvars
607+ echo enable_crtbeginTS = '$(enable_crtbeginTS)' >> tmp-libgcc.mvars
608
609 mv tmp-libgcc.mvars libgcc.mvars
610
611@@ -1982,9 +1997,19 @@
612 $(T)crtbeginT.o: crtstuff.c $(GCC_PASSES) $(TCONFIG_H) auto-host.h \
613 gbl-ctors.h stmp-int-hdrs tsystem.h coretypes.h $(TM_H)
614 $(GCC_FOR_TARGET) $(CRTSTUFF_CFLAGS) $(CRTSTUFF_T_CFLAGS) \
615+ $(ESP_NOPIE_CFLAGS) \
616 -c $(srcdir)/crtstuff.c -DCRT_BEGIN -DCRTSTUFFT_O \
617 -o $(T)crtbeginT$(objext)
618
619+# This is a version of crtbegin for -static -fPIE links if esp is enable.
620+ifeq ($(enable_crtbeginTS),yes)
621+$(T)crtbeginTS.o: crtstuff.c $(GCC_PASSES) $(TCONFIG_H) auto-host.h \
622+ gbl-ctors.h stmp-int-hdrs tsystem.h coretypes.h $(TM_H)
623+ $(GCC_FOR_TARGET) $(CRTSTUFF_CFLAGS) $(CRTSTUFF_T_CFLAGS_S) \
624+ -c $(srcdir)/crtstuff.c -DCRT_BEGIN -DCRTSTUFFT_O -DCRTSTUFFS_O \
625+ -o $(T)crtbeginTS$(objext)
626+endif
627+
628 # Compile the start modules crt0.o and mcrt0.o that are linked with
629 # every program
630 $(T)crt0.o: s-crt0 ; @true
631diff -Nur gcc-4.6.0-vanilla/gcc/objc/lang-specs.h gcc-4.6.0/gcc/objc/lang-specs.h
632--- gcc-4.6.0-vanilla/gcc/objc/lang-specs.h 2011-03-06 17:27:57.000000000 +0100
633+++ gcc-4.6.0/gcc/objc/lang-specs.h 2011-04-07 19:19:04.831773909 +0200
634@@ -30,9 +30,9 @@
635 %{traditional|traditional-cpp:\
636 %eGNU Objective C no longer supports traditional compilation}\
637 %{save-temps*|no-integrated-cpp:cc1obj -E %(cpp_options) -o %{save-temps*:%b.mi} %{!save-temps*:%g.mi} \n\
638- cc1obj -fpreprocessed %{save-temps*:%b.mi} %{!save-temps*:%g.mi} %(cc1_options) %{print-objc-runtime-info} %{gen-decls}}\
639+ cc1obj -fpreprocessed %{save-temps*:%b.mi} %{!save-temps*:%g.mi} %(cc1_options) %(esp_options) %{print-objc-runtime-info} %{gen-decls}}\
640 %{!save-temps*:%{!no-integrated-cpp:\
641- cc1obj %(cpp_unique_options) %(cc1_options) %{print-objc-runtime-info} %{gen-decls}}}\
642+ cc1obj %(cpp_unique_options) %(cc1_options) %(esp_options) %{print-objc-runtime-info} %{gen-decls}}}\
643 %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
644 {"@objective-c-header",
645 "%{E|M|MM:cc1obj -E %{traditional|traditional-cpp:-traditional-cpp}\
646@@ -41,18 +41,18 @@
647 %{traditional|traditional-cpp:\
648 %eGNU Objective C no longer supports traditional compilation}\
649 %{save-temps*|no-integrated-cpp:cc1obj -E %(cpp_options) -o %{save-temps*:%b.mi} %{!save-temps*:%g.mi} \n\
650- cc1obj -fpreprocessed %b.mi %(cc1_options) %{print-objc-runtime-info} %{gen-decls}\
651+ cc1obj -fpreprocessed %b.mi %(cc1_options)%(esp_options) %{print-objc-runtime-info} %{gen-decls}\
652 -o %g.s %{!o*:--output-pch=%i.gch}\
653 %W{o*:--output-pch=%*}%V}\
654 %{!save-temps*:%{!no-integrated-cpp:\
655- cc1obj %(cpp_unique_options) %(cc1_options) %{print-objc-runtime-info} %{gen-decls}\
656+ cc1obj %(cpp_unique_options) %(cc1_options) %(esp_options) %{print-objc-runtime-info} %{gen-decls}\
657 -o %g.s %{!o*:--output-pch=%i.gch}\
658 %W{o*:--output-pch=%*}%V}}}}}", 0, 0, 0},
659 {".mi", "@objective-c-cpp-output", 0, 0, 0},
660 {"@objective-c-cpp-output",
661- "%{!M:%{!MM:%{!E:cc1obj -fpreprocessed %i %(cc1_options) %{print-objc-runtime-info} %{gen-decls}\
662+ "%{!M:%{!MM:%{!E:cc1obj -fpreprocessed %i %(cc1_options) %(esp_options) %{print-objc-runtime-info} %{gen-decls}\
663 %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
664 {"@objc-cpp-output",
665 "%nobjc-cpp-output is deprecated; please use objective-c-cpp-output instead\n\
666- %{!M:%{!MM:%{!E:cc1obj -fpreprocessed %i %(cc1_options) %{print-objc-runtime-info} %{gen-decls}\
667+ %{!M:%{!MM:%{!E:cc1obj -fpreprocessed %i %(cc1_options) %(esp_options) %{print-objc-runtime-info} %{gen-decls}\
668 %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
669diff -Nur gcc-4.6.0-vanilla/gcc/objcp/lang-specs.h gcc-4.6.0/gcc/objcp/lang-specs.h
670--- gcc-4.6.0-vanilla/gcc/objcp/lang-specs.h 2011-03-06 17:27:57.000000000 +0100
671+++ gcc-4.6.0/gcc/objcp/lang-specs.h 2011-04-07 19:19:04.829773913 +0200
672@@ -36,7 +36,7 @@
673 %(cpp_options) %2 -o %{save-temps*:%b.mii} %{!save-temps*:%g.mii} \n}\
674 cc1objplus %{save-temps*|no-integrated-cpp:-fpreprocessed %{save-temps*:%b.mii} %{!save-temps*:%g.mii}}\
675 %{!save-temps*:%{!no-integrated-cpp:%(cpp_unique_options)}}\
676- %(cc1_options) %2\
677+ %(cc1_options) %(esp_options) %2\
678 -o %g.s %{!o*:--output-pch=%i.gch} %W{o*:--output-pch=%*}%V}}}",
679 CPLUSPLUS_CPP_SPEC, 0, 0},
680 {"@objective-c++",
681@@ -46,16 +46,16 @@
682 %(cpp_options) %2 -o %{save-temps*:%b.mii} %{!save-temps*:%g.mii} \n}\
683 cc1objplus %{save-temps*|no-integrated-cpp:-fpreprocessed %{save-temps*:%b.mii} %{!save-temps*:%g.mii}}\
684 %{!save-temps*:%{!no-integrated-cpp:%(cpp_unique_options)}}\
685- %(cc1_options) %2\
686+ %(cc1_options) %(esp_options) %2\
687 %{!fsyntax-only:%(invoke_as)}}}}",
688 CPLUSPLUS_CPP_SPEC, 0, 0},
689 {".mii", "@objective-c++-cpp-output", 0, 0, 0},
690 {"@objective-c++-cpp-output",
691 "%{!M:%{!MM:%{!E:\
692- cc1objplus -fpreprocessed %i %(cc1_options) %2\
693+ cc1objplus -fpreprocessed %i %(cc1_options) %(esp_options) %2\
694 %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
695 {"@objc++-cpp-output",
696 "%nobjc++-cpp-output is deprecated; please use objective-c++-cpp-output instead\n\
697 %{!M:%{!MM:%{!E:\
698- cc1objplus -fpreprocessed %i %(cc1_options) %2\
699+ cc1objplus -fpreprocessed %i %(cc1_options) %(esp_options) %2\
700 %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
701diff -Nur gcc-4.6.0-vanilla/gcc/varasm.c gcc-4.6.0/gcc/varasm.c
702--- gcc-4.6.0-vanilla/gcc/varasm.c 2011-02-28 16:36:37.000000000 +0100
703+++ gcc-4.6.0/gcc/varasm.c 2011-04-07 19:18:52.338800740 +0200
704@@ -6022,7 +6022,11 @@
705 bool is_local;
706
707 is_local = targetm.binds_local_p (decl);
708- if (!flag_shlib)
709+ #ifdef ENABLE_ESP
710+ if (!flag_pic)
711+ #else
712+ if (!flag_shlib)
713+ #endif
714 {
715 if (is_local)
716 kind = TLS_MODEL_LOCAL_EXEC;
717diff -Nur gcc-4.6.0-vanilla/libgcc/Makefile.in gcc-4.6.0/libgcc/Makefile.in
718--- gcc-4.6.0-vanilla/libgcc/Makefile.in 2011-01-26 05:19:58.000000000 +0100
719+++ gcc-4.6.0/libgcc/Makefile.in 2011-04-07 19:18:24.190861287 +0200
720@@ -298,6 +298,12 @@
721 gen-hide-list = echo > \$@
722 endif
723
724+# We add crtbeginTS.o to the EXTRA_PARTS list if enable_crtbeginTS = yes
725+enable_libgcc_crtbeginTS = $(enable_crtbeginTS)
726+ifeq ($(enable_libgcc_crtbeginTS),yes)
727+EXTRA_PARTS += crtbeginTS.o
728+endif
729+
730 ifneq ($(EXTRA_PARTS),)
731 extra-parts = libgcc-extra-parts
732 INSTALL_PARTS = $(EXTRA_PARTS)
733@@ -849,6 +855,13 @@
734 crtbeginT.o: $(gcc_srcdir)/crtstuff.c
735 $(crt_compile) $(CRTSTUFF_T_CFLAGS) \
736 -c $(gcc_srcdir)/crtstuff.c -DCRT_BEGIN -DCRTSTUFFT_O
737+
738+# This is a version of crtbegin for -static -fPIE links.
739+ifeq ($(enable_libgcc_crtbeginTS),yes)
740+crtbeginTS.o: $(gcc_srcdir)/crtstuff.c
741+ $(crt_compile) $(CRTSTUFF_T_CFLAGS_S) \
742+ -c $(gcc_srcdir)/crtstuff.c -DCRT_BEGIN -DCRTSTUFFT_O -DCRTSTUFFS_O
743+endif
744 endif
745
746 # Build extra startfiles in the libgcc directory.
747diff -Nur gcc-4.6.0-vanilla/libmudflap/configure gcc-4.6.0/libmudflap/configure
748--- gcc-4.6.0-vanilla/libmudflap/configure 2011-02-13 12:45:53.000000000 +0100
749+++ gcc-4.6.0/libmudflap/configure 2011-04-07 19:17:55.399923318 +0200
750@@ -652,6 +652,7 @@
751 MAINTAINER_MODE_FALSE
752 MAINTAINER_MODE_TRUE
753 am__untar
754+enable_esp
755 am__tar
756 AMTAR
757 am__leading_dot
758diff -Nur gcc-4.6.0-vanilla/Makefile.in gcc-4.6.0/Makefile.in
759--- gcc-4.6.0-vanilla/Makefile.in 2011-02-12 13:02:24.000000000 +0100
760+++ gcc-4.6.0/Makefile.in 2011-04-07 19:18:24.184861300 +0200
761@@ -356,9 +356,17 @@
762 BUILD_PREFIX = @BUILD_PREFIX@
763 BUILD_PREFIX_1 = @BUILD_PREFIX_1@
764
765+# Some stuff don't compile with SSP
766+enable_esp = @enable_esp@
767+ifeq ($(enable_esp),yes)
768+ESP_NOSSP_CFLAGS = -fno-stack-protector
769+else
770+ESP_NOSSP_CFLAGS=
771+endif
772+
773 # Flags to pass to stage2 and later makes. They are defined
774 # here so that they can be overridden by Makefile fragments.
775-BOOT_CFLAGS= -g -O2
776+BOOT_CFLAGS= -g -O2 $(ESP_NOSSP_CFLAGS)
777 BOOT_LDFLAGS=
778 BOOT_ADAFLAGS=-gnatpg -gnata
779
780@@ -403,9 +411,9 @@
781
782 CFLAGS = @CFLAGS@
783 LDFLAGS = @LDFLAGS@
784-LIBCFLAGS = $(CFLAGS)
785+LIBCFLAGS = $(CFLAGS) $(ESP_NOSSP_CFLAGS)
786 CXXFLAGS = @CXXFLAGS@
787-LIBCXXFLAGS = $(CXXFLAGS) -fno-implicit-templates
788+LIBCXXFLAGS = $(CXXFLAGS) -fno-implicit-templates $(ESP_NOSSP_CFLAGS)
789 GOCFLAGS = $(CFLAGS)
790
791 TFLAGS =