mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 20:40:05 +00:00
Work even with compilers which enable -fstack-protector by default [BZ #7065]
With all the machinery we just added, we can easily arrange to work even when the compiler passes in -fstack-protector automatically: all the necessary bits of glibc are always compiled with -fno-stack-protector now. So tear out the check in configure, and add appropriate calls to -fno-stack-protector in tests that need them (largely those that use -nostdlib), since we don't yet have a __stack_chk_fail that those tests can rely upon. (GCC often provides one, but we cannot rely on this, especially not when bootstrapping.) When stack protection is disabled, explicitly pass -fno-stack-protector to everything, to stop a compiler hacked to enable it from inserting calls to __stack_chk_fail via the PLT in every object file.
This commit is contained in:
parent
bc174f20b8
commit
66a704c43c
21
ChangeLog
21
ChangeLog
@ -1,3 +1,24 @@
|
|||||||
|
2016-12-26 Nick Alcock <nick.alcock@oracle.com>
|
||||||
|
|
||||||
|
[BZ #7065]
|
||||||
|
* configure.ac: Add check for unsupported stack-protection level.
|
||||||
|
(libc_cv_predef_stack_protector): Remove.
|
||||||
|
(no_ssp): New variable.
|
||||||
|
(STACK_PROTECTOR_LEVEL): Set to zero when --disable-stack-protector.
|
||||||
|
(stack_protector): Set to -fno-stack-protector similarly.
|
||||||
|
(libc_cv_ld_gnu_indirect_function): Use no_ssp.
|
||||||
|
(libc_cv_asm_set_directive): Likewise.
|
||||||
|
(libc_cv_protected_data): Likewise.
|
||||||
|
(libc_cv_z_combreloc): Likewise.
|
||||||
|
(libc_cv_hashstyle): Likewise.
|
||||||
|
(libc_cv_has_glob_dat): Likewise.
|
||||||
|
(libc_cv_output_format): Likewise.
|
||||||
|
(libc_cv_output_format): Likewise.
|
||||||
|
(libc_cv_ehdr_start): Likewise.
|
||||||
|
* aclocal.m4 (LIBC_TRY_LINK_STATIC): Likewise.
|
||||||
|
(LIBC_LINKER_FEATURE): Likewise.
|
||||||
|
(LIBC_COMPILER_BUILTIN_INLINED): Likewise.
|
||||||
|
|
||||||
2016-12-26 Nick Alcock <nick.alcock@oracle.com>
|
2016-12-26 Nick Alcock <nick.alcock@oracle.com>
|
||||||
|
|
||||||
[BZ #7065]
|
[BZ #7065]
|
||||||
|
6
aclocal.m4
vendored
6
aclocal.m4
vendored
@ -141,7 +141,7 @@ int _start (void) { return 0; }
|
|||||||
int __start (void) { return 0; }
|
int __start (void) { return 0; }
|
||||||
$1
|
$1
|
||||||
EOF
|
EOF
|
||||||
AS_IF([AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -o conftest
|
AS_IF([AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp -o conftest
|
||||||
conftest.c -static -nostartfiles -nostdlib
|
conftest.c -static -nostartfiles -nostdlib
|
||||||
1>&AS_MESSAGE_LOG_FD])],
|
1>&AS_MESSAGE_LOG_FD])],
|
||||||
[$2], [$3])
|
[$2], [$3])
|
||||||
@ -226,7 +226,7 @@ if test x"$gnu_ld" = x"yes"; then
|
|||||||
cat > conftest.c <<EOF
|
cat > conftest.c <<EOF
|
||||||
int _start (void) { return 42; }
|
int _start (void) { return 42; }
|
||||||
EOF
|
EOF
|
||||||
if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS
|
if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp
|
||||||
$2 -nostdlib -nostartfiles
|
$2 -nostdlib -nostartfiles
|
||||||
-fPIC -shared -o conftest.so conftest.c
|
-fPIC -shared -o conftest.so conftest.c
|
||||||
1>&AS_MESSAGE_LOG_FD])
|
1>&AS_MESSAGE_LOG_FD])
|
||||||
@ -268,7 +268,7 @@ libc_compiler_builtin_inlined=no
|
|||||||
cat > conftest.c <<EOF
|
cat > conftest.c <<EOF
|
||||||
int _start (void) { $2 return 0; }
|
int _start (void) { $2 return 0; }
|
||||||
EOF
|
EOF
|
||||||
if ! AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS
|
if ! AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp
|
||||||
$3 -nostdlib -nostartfiles
|
$3 -nostdlib -nostartfiles
|
||||||
-S conftest.c -o - | fgrep "$1"
|
-S conftest.c -o - | fgrep "$1"
|
||||||
1>&AS_MESSAGE_LOG_FD])
|
1>&AS_MESSAGE_LOG_FD])
|
||||||
|
90
configure
vendored
90
configure
vendored
@ -4010,11 +4010,25 @@ elif test "$enable_stack_protector" = strong && test "$libc_cv_ssp_strong" = yes
|
|||||||
stack_protector="-fstack-protector-strong"
|
stack_protector="-fstack-protector-strong"
|
||||||
$as_echo "#define STACK_PROTECTOR_LEVEL 3" >>confdefs.h
|
$as_echo "#define STACK_PROTECTOR_LEVEL 3" >>confdefs.h
|
||||||
|
|
||||||
|
else
|
||||||
|
stack_protector="-fno-stack-protector"
|
||||||
|
$as_echo "#define STACK_PROTECTOR_LEVEL 0" >>confdefs.h
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if test -n "$stack_protector"; then
|
||||||
|
no_ssp=-fno-stack-protector
|
||||||
|
else
|
||||||
|
no_ssp=
|
||||||
|
|
||||||
|
if test "$enable_stack_protector" != no; then
|
||||||
|
as_fn_error $? "--enable-stack-protector=$enable_stack_protector specified, but specified level of stack protection is not supported by the compiler." "$LINENO" 5
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# For the multi-arch option we need support in the assembler & linker.
|
# For the multi-arch option we need support in the assembler & linker.
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for assembler and linker STT_GNU_IFUNC support" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for assembler and linker STT_GNU_IFUNC support" >&5
|
||||||
$as_echo_n "checking for assembler and linker STT_GNU_IFUNC support... " >&6; }
|
$as_echo_n "checking for assembler and linker STT_GNU_IFUNC support... " >&6; }
|
||||||
@ -4037,7 +4051,7 @@ __start:
|
|||||||
EOF
|
EOF
|
||||||
libc_cv_ld_gnu_indirect_function=no
|
libc_cv_ld_gnu_indirect_function=no
|
||||||
if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \
|
if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \
|
||||||
-nostartfiles -nostdlib \
|
-nostartfiles -nostdlib $no_ssp \
|
||||||
-o conftest conftest.S 1>&5 2>&5; then
|
-o conftest conftest.S 1>&5 2>&5; then
|
||||||
# Do a link to see if the backend supports IFUNC relocs.
|
# Do a link to see if the backend supports IFUNC relocs.
|
||||||
$READELF -r conftest 1>&5
|
$READELF -r conftest 1>&5
|
||||||
@ -5532,7 +5546,7 @@ extern int glibc_conftest_frobozz;
|
|||||||
void _start() { glibc_conftest_frobozz = 1; }
|
void _start() { glibc_conftest_frobozz = 1; }
|
||||||
EOF
|
EOF
|
||||||
if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \
|
if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \
|
||||||
-nostartfiles -nostdlib \
|
-nostartfiles -nostdlib $no_ssp \
|
||||||
-o conftest conftest.s conftest1.c 1>&5 2>&5; then
|
-o conftest conftest.s conftest1.c 1>&5 2>&5; then
|
||||||
libc_cv_asm_set_directive=yes
|
libc_cv_asm_set_directive=yes
|
||||||
else
|
else
|
||||||
@ -5556,7 +5570,7 @@ else
|
|||||||
int bar __attribute__ ((visibility ("protected"))) = 1;
|
int bar __attribute__ ((visibility ("protected"))) = 1;
|
||||||
EOF
|
EOF
|
||||||
libc_cv_protected_data=no
|
libc_cv_protected_data=no
|
||||||
if { ac_try='${CC-cc} -nostdlib -nostartfiles -fPIC -shared conftest.c -o conftest.so'
|
if { ac_try='${CC-cc} -nostdlib -nostartfiles $no_ssp -fPIC -shared conftest.c -o conftest.so'
|
||||||
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
||||||
(eval $ac_try) 2>&5
|
(eval $ac_try) 2>&5
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
@ -5566,7 +5580,7 @@ EOF
|
|||||||
extern int bar;
|
extern int bar;
|
||||||
int main (void) { return bar; }
|
int main (void) { return bar; }
|
||||||
EOF
|
EOF
|
||||||
if { ac_try='${CC-cc} -nostdlib -nostartfiles conftest.c -o conftest conftest.so'
|
if { ac_try='${CC-cc} -nostdlib -nostartfiles $no_ssp conftest.c -o conftest conftest.so'
|
||||||
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
||||||
(eval $ac_try) 2>&5
|
(eval $ac_try) 2>&5
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
@ -5651,7 +5665,7 @@ __attribute__ ((constructor)) void ctor (void) { asm (""); }
|
|||||||
__attribute__ ((destructor)) void dtor (void) { asm (""); }
|
__attribute__ ((destructor)) void dtor (void) { asm (""); }
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -o conftest
|
if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp -o conftest
|
||||||
conftest.c -static -nostartfiles -nostdlib
|
conftest.c -static -nostartfiles -nostdlib
|
||||||
1>&5'
|
1>&5'
|
||||||
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
||||||
@ -5764,7 +5778,7 @@ extern int mumble;
|
|||||||
int foo (void) { return bar (mumble); }
|
int foo (void) { return bar (mumble); }
|
||||||
EOF
|
EOF
|
||||||
if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS
|
if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS
|
||||||
-fPIC -shared -o conftest.so conftest.c
|
-fPIC -shared $no_ssp -o conftest.so conftest.c
|
||||||
-nostdlib -nostartfiles
|
-nostdlib -nostartfiles
|
||||||
-Wl,-z,combreloc 1>&5'
|
-Wl,-z,combreloc 1>&5'
|
||||||
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
||||||
@ -5800,7 +5814,7 @@ if test x"$gnu_ld" = x"yes"; then
|
|||||||
cat > conftest.c <<EOF
|
cat > conftest.c <<EOF
|
||||||
int _start (void) { return 42; }
|
int _start (void) { return 42; }
|
||||||
EOF
|
EOF
|
||||||
if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS
|
if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp
|
||||||
-Wl,-z,execstack -nostdlib -nostartfiles
|
-Wl,-z,execstack -nostdlib -nostartfiles
|
||||||
-fPIC -shared -o conftest.so conftest.c
|
-fPIC -shared -o conftest.so conftest.c
|
||||||
1>&5'
|
1>&5'
|
||||||
@ -5854,7 +5868,7 @@ else
|
|||||||
cat > conftest.c <<EOF
|
cat > conftest.c <<EOF
|
||||||
int _start (void) { return 42; }
|
int _start (void) { return 42; }
|
||||||
EOF
|
EOF
|
||||||
if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS
|
if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp
|
||||||
-fPIC -shared -o conftest.so conftest.c
|
-fPIC -shared -o conftest.so conftest.c
|
||||||
-Wl,--hash-style=both -nostdlib 1>&5'
|
-Wl,--hash-style=both -nostdlib 1>&5'
|
||||||
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
||||||
@ -5947,7 +5961,7 @@ int foo (void) { return mumble; }
|
|||||||
EOF
|
EOF
|
||||||
if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS
|
if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS
|
||||||
-fPIC -shared -o conftest.so conftest.c
|
-fPIC -shared -o conftest.so conftest.c
|
||||||
-nostdlib -nostartfiles
|
-nostdlib -nostartfiles $no_ssp
|
||||||
1>&5'
|
1>&5'
|
||||||
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
||||||
(eval $ac_try) 2>&5
|
(eval $ac_try) 2>&5
|
||||||
@ -5975,7 +5989,7 @@ if ${libc_cv_output_format+:} false; then :
|
|||||||
$as_echo_n "(cached) " >&6
|
$as_echo_n "(cached) " >&6
|
||||||
else
|
else
|
||||||
if libc_cv_output_format=`
|
if libc_cv_output_format=`
|
||||||
${CC-cc} -nostartfiles -nostdlib -Wl,--print-output-format 2>&5`
|
${CC-cc} -nostartfiles -nostdlib $no_ssp -Wl,--print-output-format 2>&5`
|
||||||
then
|
then
|
||||||
:
|
:
|
||||||
else
|
else
|
||||||
@ -6453,60 +6467,6 @@ if test $libc_cv_predef_fortify_source = yes; then
|
|||||||
fi
|
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'"
|
|
||||||
# On some architectures, there are architecture-specific undefined
|
|
||||||
# symbols (resolved by the linker), so filter out unknown symbols.
|
|
||||||
# This will fail to produce the correct result if the compiler
|
|
||||||
# defaults to -fstack-protector but this produces an undefined symbol
|
|
||||||
# other than __stack_chk_fail or __stack_chk_fail_local. However,
|
|
||||||
# compilers like that have not been encountered in practice.
|
|
||||||
libc_undefs=`echo "$libc_undefs" | \
|
|
||||||
egrep '^(foobar|__stack_chk_fail|__stack_chk_fail_local)$'`
|
|
||||||
case "$libc_undefs" in
|
|
||||||
foobar) libc_cv_predef_stack_protector=no ;;
|
|
||||||
'__stack_chk_fail
|
|
||||||
foobar'|'__stack_chk_fail_local
|
|
||||||
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="$libc_extra_cflags -fno-stack-protector"
|
|
||||||
fi
|
|
||||||
libc_extra_cppflags=
|
|
||||||
|
|
||||||
# Some linkers on some architectures support __ehdr_start but with
|
# Some linkers on some architectures support __ehdr_start but with
|
||||||
# bugs. Make sure usage of it does not create relocations in the
|
# bugs. Make sure usage of it does not create relocations in the
|
||||||
# output (as the linker should resolve them all for us).
|
# output (as the linker should resolve them all for us).
|
||||||
@ -6520,7 +6480,7 @@ old_CFLAGS="$CFLAGS"
|
|||||||
old_LDFLAGS="$LDFLAGS"
|
old_LDFLAGS="$LDFLAGS"
|
||||||
old_LIBS="$LIBS"
|
old_LIBS="$LIBS"
|
||||||
CFLAGS="$CFLAGS -fPIC"
|
CFLAGS="$CFLAGS -fPIC"
|
||||||
LDFLAGS="$LDFLAGS -nostdlib -nostartfiles -shared"
|
LDFLAGS="$LDFLAGS -nostdlib -nostartfiles -shared $no_ssp"
|
||||||
LIBS=
|
LIBS=
|
||||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
/* end confdefs.h. */
|
/* end confdefs.h. */
|
||||||
|
75
configure.ac
75
configure.ac
@ -665,11 +665,26 @@ elif test "$enable_stack_protector" = all && test "$libc_cv_ssp_all" = yes; then
|
|||||||
elif test "$enable_stack_protector" = strong && test "$libc_cv_ssp_strong" = yes; then
|
elif test "$enable_stack_protector" = strong && test "$libc_cv_ssp_strong" = yes; then
|
||||||
stack_protector="-fstack-protector-strong"
|
stack_protector="-fstack-protector-strong"
|
||||||
AC_DEFINE(STACK_PROTECTOR_LEVEL, 3)
|
AC_DEFINE(STACK_PROTECTOR_LEVEL, 3)
|
||||||
|
else
|
||||||
|
stack_protector="-fno-stack-protector"
|
||||||
|
AC_DEFINE(STACK_PROTECTOR_LEVEL, 0)
|
||||||
fi
|
fi
|
||||||
AC_SUBST(libc_cv_ssp)
|
AC_SUBST(libc_cv_ssp)
|
||||||
AC_SUBST(stack_protector)
|
AC_SUBST(stack_protector)
|
||||||
AC_SUBST(no_stack_protector)
|
AC_SUBST(no_stack_protector)
|
||||||
|
|
||||||
|
if test -n "$stack_protector"; then
|
||||||
|
dnl Don't run configure tests with stack-protection on, to avoid problems with
|
||||||
|
dnl bootstrapping.
|
||||||
|
no_ssp=-fno-stack-protector
|
||||||
|
else
|
||||||
|
no_ssp=
|
||||||
|
|
||||||
|
if test "$enable_stack_protector" != no; then
|
||||||
|
AC_MSG_ERROR([--enable-stack-protector=$enable_stack_protector specified, but specified level of stack protection is not supported by the compiler.])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# For the multi-arch option we need support in the assembler & linker.
|
# For the multi-arch option we need support in the assembler & linker.
|
||||||
AC_CACHE_CHECK([for assembler and linker STT_GNU_IFUNC support],
|
AC_CACHE_CHECK([for assembler and linker STT_GNU_IFUNC support],
|
||||||
libc_cv_ld_gnu_indirect_function, [dnl
|
libc_cv_ld_gnu_indirect_function, [dnl
|
||||||
@ -689,7 +704,7 @@ __start:
|
|||||||
EOF
|
EOF
|
||||||
libc_cv_ld_gnu_indirect_function=no
|
libc_cv_ld_gnu_indirect_function=no
|
||||||
if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \
|
if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \
|
||||||
-nostartfiles -nostdlib \
|
-nostartfiles -nostdlib $no_ssp \
|
||||||
-o conftest conftest.S 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then
|
-o conftest conftest.S 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then
|
||||||
# Do a link to see if the backend supports IFUNC relocs.
|
# Do a link to see if the backend supports IFUNC relocs.
|
||||||
$READELF -r conftest 1>&AS_MESSAGE_LOG_FD
|
$READELF -r conftest 1>&AS_MESSAGE_LOG_FD
|
||||||
@ -1213,7 +1228,7 @@ extern int glibc_conftest_frobozz;
|
|||||||
void _start() { glibc_conftest_frobozz = 1; }
|
void _start() { glibc_conftest_frobozz = 1; }
|
||||||
EOF
|
EOF
|
||||||
if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \
|
if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \
|
||||||
-nostartfiles -nostdlib \
|
-nostartfiles -nostdlib $no_ssp \
|
||||||
-o conftest conftest.s conftest1.c 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then
|
-o conftest conftest.s conftest1.c 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then
|
||||||
libc_cv_asm_set_directive=yes
|
libc_cv_asm_set_directive=yes
|
||||||
else
|
else
|
||||||
@ -1230,12 +1245,12 @@ AC_CACHE_CHECK(linker support for protected data symbol,
|
|||||||
int bar __attribute__ ((visibility ("protected"))) = 1;
|
int bar __attribute__ ((visibility ("protected"))) = 1;
|
||||||
EOF
|
EOF
|
||||||
libc_cv_protected_data=no
|
libc_cv_protected_data=no
|
||||||
if AC_TRY_COMMAND(${CC-cc} -nostdlib -nostartfiles -fPIC -shared conftest.c -o conftest.so); then
|
if AC_TRY_COMMAND(${CC-cc} -nostdlib -nostartfiles $no_ssp -fPIC -shared conftest.c -o conftest.so); then
|
||||||
cat > conftest.c <<EOF
|
cat > conftest.c <<EOF
|
||||||
extern int bar;
|
extern int bar;
|
||||||
int main (void) { return bar; }
|
int main (void) { return bar; }
|
||||||
EOF
|
EOF
|
||||||
if AC_TRY_COMMAND(${CC-cc} -nostdlib -nostartfiles conftest.c -o conftest conftest.so); then
|
if AC_TRY_COMMAND(${CC-cc} -nostdlib -nostartfiles $no_ssp conftest.c -o conftest conftest.so); then
|
||||||
libc_cv_protected_data=yes
|
libc_cv_protected_data=yes
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@ -1357,7 +1372,7 @@ extern int mumble;
|
|||||||
int foo (void) { return bar (mumble); }
|
int foo (void) { return bar (mumble); }
|
||||||
EOF
|
EOF
|
||||||
if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS
|
if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS
|
||||||
-fPIC -shared -o conftest.so conftest.c
|
-fPIC -shared $no_ssp -o conftest.so conftest.c
|
||||||
-nostdlib -nostartfiles
|
-nostdlib -nostartfiles
|
||||||
-Wl,-z,combreloc 1>&AS_MESSAGE_LOG_FD])
|
-Wl,-z,combreloc 1>&AS_MESSAGE_LOG_FD])
|
||||||
then
|
then
|
||||||
@ -1395,7 +1410,7 @@ AC_CACHE_CHECK(for --hash-style option,
|
|||||||
cat > conftest.c <<EOF
|
cat > conftest.c <<EOF
|
||||||
int _start (void) { return 42; }
|
int _start (void) { return 42; }
|
||||||
EOF
|
EOF
|
||||||
if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS
|
if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp
|
||||||
-fPIC -shared -o conftest.so conftest.c
|
-fPIC -shared -o conftest.so conftest.c
|
||||||
-Wl,--hash-style=both -nostdlib 1>&AS_MESSAGE_LOG_FD])
|
-Wl,--hash-style=both -nostdlib 1>&AS_MESSAGE_LOG_FD])
|
||||||
then
|
then
|
||||||
@ -1467,7 +1482,7 @@ int foo (void) { return mumble; }
|
|||||||
EOF
|
EOF
|
||||||
if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS
|
if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS
|
||||||
-fPIC -shared -o conftest.so conftest.c
|
-fPIC -shared -o conftest.so conftest.c
|
||||||
-nostdlib -nostartfiles
|
-nostdlib -nostartfiles $no_ssp
|
||||||
1>&AS_MESSAGE_LOG_FD])
|
1>&AS_MESSAGE_LOG_FD])
|
||||||
then
|
then
|
||||||
dnl look for GLOB_DAT relocation.
|
dnl look for GLOB_DAT relocation.
|
||||||
@ -1484,7 +1499,7 @@ AC_SUBST(libc_cv_has_glob_dat)
|
|||||||
|
|
||||||
AC_CACHE_CHECK(linker output format, libc_cv_output_format, [dnl
|
AC_CACHE_CHECK(linker output format, libc_cv_output_format, [dnl
|
||||||
if libc_cv_output_format=`
|
if libc_cv_output_format=`
|
||||||
${CC-cc} -nostartfiles -nostdlib -Wl,--print-output-format 2>&AS_MESSAGE_LOG_FD`
|
${CC-cc} -nostartfiles -nostdlib $no_ssp -Wl,--print-output-format 2>&AS_MESSAGE_LOG_FD`
|
||||||
then
|
then
|
||||||
:
|
:
|
||||||
else
|
else
|
||||||
@ -1703,48 +1718,6 @@ if test $libc_cv_predef_fortify_source = yes; then
|
|||||||
fi
|
fi
|
||||||
AC_SUBST(CPPUNDEFS)
|
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'"
|
|
||||||
# On some architectures, there are architecture-specific undefined
|
|
||||||
# symbols (resolved by the linker), so filter out unknown symbols.
|
|
||||||
# This will fail to produce the correct result if the compiler
|
|
||||||
# defaults to -fstack-protector but this produces an undefined symbol
|
|
||||||
# other than __stack_chk_fail or __stack_chk_fail_local. However,
|
|
||||||
# compilers like that have not been encountered in practice.
|
|
||||||
libc_undefs=`echo "$libc_undefs" | \
|
|
||||||
egrep '^(foobar|__stack_chk_fail|__stack_chk_fail_local)$'`
|
|
||||||
case "$libc_undefs" in
|
|
||||||
foobar) libc_cv_predef_stack_protector=no ;;
|
|
||||||
'__stack_chk_fail
|
|
||||||
foobar'|'__stack_chk_fail_local
|
|
||||||
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="$libc_extra_cflags -fno-stack-protector"
|
|
||||||
fi
|
|
||||||
libc_extra_cppflags=
|
|
||||||
|
|
||||||
# Some linkers on some architectures support __ehdr_start but with
|
# Some linkers on some architectures support __ehdr_start but with
|
||||||
# bugs. Make sure usage of it does not create relocations in the
|
# bugs. Make sure usage of it does not create relocations in the
|
||||||
# output (as the linker should resolve them all for us).
|
# output (as the linker should resolve them all for us).
|
||||||
@ -1754,7 +1727,7 @@ old_CFLAGS="$CFLAGS"
|
|||||||
old_LDFLAGS="$LDFLAGS"
|
old_LDFLAGS="$LDFLAGS"
|
||||||
old_LIBS="$LIBS"
|
old_LIBS="$LIBS"
|
||||||
CFLAGS="$CFLAGS -fPIC"
|
CFLAGS="$CFLAGS -fPIC"
|
||||||
LDFLAGS="$LDFLAGS -nostdlib -nostartfiles -shared"
|
LDFLAGS="$LDFLAGS -nostdlib -nostartfiles -shared $no_ssp"
|
||||||
LIBS=
|
LIBS=
|
||||||
AC_LINK_IFELSE([AC_LANG_SOURCE([
|
AC_LINK_IFELSE([AC_LANG_SOURCE([
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
Loading…
Reference in New Issue
Block a user