diff options
author | Roland McGrath <roland@hack.frob.com> | 2012-05-14 16:08:25 -0700 |
---|---|---|
committer | Roland McGrath <roland@hack.frob.com> | 2012-05-16 16:22:50 -0700 |
commit | 30b99d798f9728a96d4766dd3f7fcfe5daae8945 (patch) | |
tree | 1dae148d2523a99037637ee4cdf9e58261bea288 | |
parent | 61653dfb81b776bb72ce4304175b861d77c357a8 (diff) | |
download | glibc-30b99d798f9728a96d4766dd3f7fcfe5daae8945.tar.gz |
BZ#10375: Configure magic to use -fno-stack-protector if needed.
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | Makeconfig | 2 | ||||
-rw-r--r-- | NEWS | 28 | ||||
-rw-r--r-- | config.make.in | 1 | ||||
-rwxr-xr-x | configure | 139 | ||||
-rw-r--r-- | configure.in | 34 |
6 files changed, 198 insertions, 15 deletions
@@ -1,6 +1,15 @@ 2012-05-16 Roland McGrath <roland@hack.frob.com> [BZ #10375] + * configure.in (NM): Add AC_CHECK_TOOL for it. + (libc_extra_cflags): New substituted variable. + Check for -fstack-protector being used implicitly. + * configure: Regenerated. + * config.make.in (config-extra-cflags): New variable, + gets @libc_extra_cflags@. + * Makeconfig (CFLAGS): Add $(config-extra-cflags) near the front. + + [BZ #10375] * configure.in: Check for _FORTIFY_SOURCE being predefined. (CPPUNDEFS): New substituted variable; add -U_FORTIFY_SOURCE if needed. * configure: Regenerated. diff --git a/Makeconfig b/Makeconfig index b81594f077..3a09764dfa 100644 --- a/Makeconfig +++ b/Makeconfig @@ -668,7 +668,7 @@ CPPFLAGS = $(CPPUNDEFS) $(CPPFLAGS-config) $($(subdir)-CPPFLAGS) \ $(foreach lib,$(libof-$(basename $(@F))) \ $(libof-$(<F)) $(libof-$(@F)),$(CPPFLAGS-$(lib))) \ $(CPPFLAGS-$(<F)) $(CPPFLAGS-$(@F)) $(CPPFLAGS-$(basename $(@F))) -override CFLAGS = -std=gnu99 $(gnu89-inline-CFLAGS) \ +override CFLAGS = -std=gnu99 $(gnu89-inline-CFLAGS) $(config-extra-cflags) \ $(filter-out %frame-pointer,$(+cflags)) $(+gccwarn-c) \ $(sysdep-CFLAGS) $(CFLAGS-$(suffix $@)) $(CFLAGS-$(<F)) \ $(CFLAGS-$(@F)) \ @@ -14,20 +14,20 @@ Version 2.16 3440, 3748, 3768, 3866, 3868, 3906, 3976, 3992, 4026, 4108, 4596, 4822, 5077, 5461, 5805, 5993, 6471, 6486, 6578, 6649, 6730, 6770, 6794, 6884, 6890, 6894, 6895, 6907, 6911, 6959, 7064, 9739, 9902, 10110, 10135, 10140, - 10153, 10210, 10254, 10346, 10545, 10716, 11174, 11322, 11365, 11451, - 11494, 11521, 11677, 11837, 11959, 12047, 12097, 12193, 12297, 12298, - 12301, 12340, 12354, 13058, 13361, 13525, 13526, 13527, 13528, 13529, - 13530, 13531, 13532, 13533, 13547, 13551, 13552, 13553, 13555, 13556, - 13559, 13563, 13566, 13583, 13592, 13594, 13613, 13618, 13637, 13656, - 13658, 13673, 13691, 13695, 13704, 13705, 13706, 13726, 13738, 13739, - 13750, 13758, 13760, 13761, 13775, 13786, 13787, 13792, 13806, 13824, - 13840, 13841, 13844, 13846, 13851, 13852, 13854, 13871, 13872, 13873, - 13879, 13883, 13884, 13885, 13886, 13892, 13895, 13908, 13910, 13911, - 13912, 13913, 13914, 13915, 13916, 13917, 13918, 13919, 13920, 13921, - 13922, 13923, 13924, 13926, 13927, 13928, 13938, 13941, 13942, 13954, - 13955, 13956, 13963, 13967, 13970, 13973, 13979, 13983, 13986, 14012, - 14027, 14033, 14034, 14040, 14043, 14044, 14049, 14053, 14055, 14064, - 14080, 14083, 14103, 14104, 14109 + 10153, 10210, 10254, 10346, 10375 10545, 10716, 11174, 11322, 11365, + 11451, 11494, 11521, 11677, 11837, 11959, 12047, 12097, 12193, 12297, + 12298, 12301, 12340, 12354, 13058, 13361, 13525, 13526, 13527, 13528, + 13529, 13530, 13531, 13532, 13533, 13547, 13551, 13552, 13553, 13555, + 13556, 13559, 13563, 13566, 13583, 13592, 13594, 13613, 13618, 13637, + 13656, 13658, 13673, 13691, 13695, 13704, 13705, 13706, 13726, 13738, + 13739, 13750, 13758, 13760, 13761, 13775, 13786, 13787, 13792, 13806, + 13824, 13840, 13841, 13844, 13846, 13851, 13852, 13854, 13871, 13872, + 13873, 13879, 13883, 13884, 13885, 13886, 13892, 13895, 13908, 13910, + 13911, 13912, 13913, 13914, 13915, 13916, 13917, 13918, 13919, 13920, + 13921, 13922, 13923, 13924, 13926, 13927, 13928, 13938, 13941, 13942, + 13954, 13955, 13956, 13963, 13967, 13970, 13973, 13979, 13983, 13986, + 14012, 14027, 14033, 14034, 14040, 14043, 14044, 14049, 14053, 14055, + 14064, 14080, 14083, 14103, 14104, 14109 * ISO C11 support: diff --git a/config.make.in b/config.make.in index 4fa26081ff..f0db19929b 100644 --- a/config.make.in +++ b/config.make.in @@ -34,6 +34,7 @@ config-sysdirs = @sysnames@ cflags-cpu = @libc_cv_cc_submachine@ asflags-cpu = @libc_cv_cc_submachine@ +config-extra-cflags = @libc_extra_cflags@ config-cflags-sse4 = @libc_cv_cc_sse4@ config-cflags-avx = @libc_cv_cc_avx@ config-cflags-sse2avx = @libc_cv_cc_sse2avx@ @@ -632,6 +632,7 @@ libc_cv_localedir libc_cv_slibdir old_glibc_headers libc_cv_gcc_unwind_find_fde +libc_extra_cflags CPPUNDEFS sizeof_long_double EGREP @@ -666,6 +667,7 @@ libc_cv_gcc_static_libgcc CXX_SYSINCLUDES SYSINCLUDES AUTOCONF +NM READELF SED MAKEINFO @@ -5154,6 +5156,98 @@ else READELF="$ac_cv_prog_READELF" fi +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nm", so it can be a program name with args. +set dummy ${ac_tool_prefix}nm; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + ac_cv_prog_NM="$NM" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_NM="${ac_tool_prefix}nm" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NM=$ac_cv_prog_NM +if test -n "$NM"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NM" >&5 +$as_echo "$NM" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NM"; then + ac_ct_NM=$NM + # Extract the first word of "nm", so it can be a program name with args. +set dummy nm; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NM"; then + ac_cv_prog_ac_ct_NM="$ac_ct_NM" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_NM="nm" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NM=$ac_cv_prog_ac_ct_NM +if test -n "$ac_ct_NM"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NM" >&5 +$as_echo "$ac_ct_NM" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NM" = x; then + NM="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NM=$ac_ct_NM + fi +else + NM="$ac_cv_prog_NM" +fi + for ac_prog in autoconf do @@ -7577,6 +7671,51 @@ if test $libc_cv_predef_fortify_source = yes; then fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC implicitly enables -fstack-protector" >&5 +$as_echo_n "checking whether $CC implicitly enables -fstack-protector... " >&6; } +if ${libc_cv_predef_stack_protector+:} false; then : + $as_echo_n "(cached) " >&6 +else + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +extern void foobar (char *); +int +main () +{ +char large_array[2048]; foobar (large_array); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +libc_undefs=`$NM -u conftest.o | + LC_ALL=C $AWK '$1 == "U" { print $2 | "sort -u"; next } { exit(1) }' \ + 2>&5` || { + as_fn_error $? "confusing output from $NM -u" "$LINENO" 5 +} +echo >&5 "libc_undefs='$libc_undefs'" +case "$libc_undefs" in +foobar) libc_cv_predef_stack_protector=no ;; +'__stack_chk_fail +foobar') libc_cv_predef_stack_protector=yes ;; +*) as_fn_error $? "unexpected symbols in test: $libc_undefs" "$LINENO" 5 ;; +esac +else + as_fn_error $? "test compilation failed" "$LINENO" 5 +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_predef_stack_protector" >&5 +$as_echo "$libc_cv_predef_stack_protector" >&6; } +libc_extra_cflags= +if test $libc_cv_predef_stack_protector = yes; then + libc_extra_cflags=-fno-stack-protector +fi + + ### End of automated tests. ### Now run sysdeps configure fragments. diff --git a/configure.in b/configure.in index 0916e9ec5c..a9ee7334d6 100644 --- a/configure.in +++ b/configure.in @@ -927,6 +927,7 @@ AC_CHECK_PROG_VER(SED, sed, --version, SED=: aux_missing="$aux_missing sed") AC_CHECK_TOOL(READELF, readelf, false) +AC_CHECK_TOOL(NM, nm, false) AC_CHECK_PROGS(AUTOCONF, autoconf, no) case "x$AUTOCONF" in @@ -2052,6 +2053,39 @@ if test $libc_cv_predef_fortify_source = yes; then fi AC_SUBST(CPPUNDEFS) +dnl Check for silly hacked compilers inserting -fstack-protector. +dnl This breaks badly for the early startup code we compile, since +dnl the compiled code can refer to a magic machine-dependent location +dnl for the canary value before we have sufficient setup for that to +dnl work. It's also questionable to build all of libc with this flag +dnl even when you're doing that for most applications you build, since +dnl libc's code is so heavily-used and performance-sensitive. If we +dnl ever really want to make that work, it should be enabled explicitly +dnl in the libc build, not inherited from implicit compiler settings. +AC_CACHE_CHECK([whether $CC implicitly enables -fstack-protector], + libc_cv_predef_stack_protector, [ +AC_TRY_COMPILE([extern void foobar (char *);], + [char large_array[2048]; foobar (large_array);], [ +libc_undefs=`$NM -u conftest.o | + LC_ALL=C $AWK '$1 == "U" { print $2 | "sort -u"; next } { exit(1) }' \ + 2>&AS_MESSAGE_LOG_FD` || { + AC_MSG_ERROR([confusing output from $NM -u]) +} +echo >&AS_MESSAGE_LOG_FD "libc_undefs='$libc_undefs'" +case "$libc_undefs" in +foobar) libc_cv_predef_stack_protector=no ;; +'__stack_chk_fail +foobar') libc_cv_predef_stack_protector=yes ;; +*) AC_MSG_ERROR([unexpected symbols in test: $libc_undefs]) ;; +esac], + [AC_MSG_ERROR([test compilation failed])]) +]) +libc_extra_cflags= +if test $libc_cv_predef_stack_protector = yes; then + libc_extra_cflags=-fno-stack-protector +fi +AC_SUBST(libc_extra_cflags) + ### End of automated tests. ### Now run sysdeps configure fragments. |