BZ#10375: Configure magic to use -fno-stack-protector if needed.

This commit is contained in:
Roland McGrath 2012-05-14 16:08:25 -07:00
parent 61653dfb81
commit 30b99d798f
6 changed files with 198 additions and 15 deletions

View File

@ -1,5 +1,14 @@
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.

View File

@ -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)) \

28
NEWS
View File

@ -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:

View File

@ -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@

139
configure vendored
View File

@ -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.

View File

@ -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.