s390x: Require GCC 7.1 or later to build glibc.

GCC 6.5 fails to correctly build ldconfig with recent ld.so.cache
commits, e.g.:
785969a047
elf: Implement a string table for ldconfig, with tail merging

If glibc is build with gcc 6.5.0:
__builtin_add_overflow is used in
<glibc>/elf/stringtable.c:stringtable_finalize()
which leads to ldconfig failing with "String table is too large".
This is also recognizable in following tests:
FAIL: elf/tst-glibc-hwcaps-cache
FAIL: elf/tst-glibc-hwcaps-prepend-cache
FAIL: elf/tst-ldconfig-X
FAIL: elf/tst-ldconfig-bad-aux-cache
FAIL: elf/tst-ldconfig-ld_so_conf-update
FAIL: elf/tst-stringtable

See gcc "Bug 98269 - gcc 6.5.0 __builtin_add_overflow() with small
uint32_t values incorrectly detects overflow"
(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98269)
This commit is contained in:
Stefan Liebler 2020-12-15 15:18:03 +01:00
parent 29a4db291b
commit 844b4d8b4b
5 changed files with 59 additions and 0 deletions

View file

@ -467,6 +467,9 @@ build the GNU C Library:
For ARC architecture builds, GCC 8.3 or higher is needed.
For s390x architecture builds, GCC 7.1 or higher is needed (See gcc
Bug 98269).
For multi-arch support it is recommended to use a GCC which has
been built with support for GNU indirect functions. This ensures
that correct debugging information is generated for functions

2
NEWS
View file

@ -67,6 +67,8 @@ Changes to build and runtime requirements:
(and pseudo-terminals are supported), a devpts file system is mounted
on /dev/pts. Current systems already meet these requirements.
* s390x requires GCC 7.1 or newer. See gcc Bug 98269.
Security related changes:
CVE-2020-27618: An infinite loop has been fixed in the iconv program when

View file

@ -509,6 +509,8 @@ Library with support for IEEE long double.
For ARC architecture builds, GCC 8.3 or higher is needed.
For s390x architecture builds, GCC 7.1 or higher is needed (See gcc Bug 98269).
For multi-arch support it is recommended to use a GCC which has been built with
support for GNU indirect functions. This ensures that correct debugging
information is generated for functions selected by IFUNC resolvers. This

View file

@ -296,5 +296,40 @@ then
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC is sufficient to build libc on s390x" >&5
$as_echo_n "checking if $CC is sufficient to build libc on s390x... " >&6; }
if ${libc_cv_compiler_ok_on_s390x+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
#if !defined __GNUC__ || __GNUC__ < 7 || (__GNUC__ == 7 && __GNUC_MINOR__ < 1)
#error insufficient compiler for building on s390x
#endif
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
libc_cv_compiler_ok_on_s390x=yes
else
libc_cv_compiler_ok_on_s390x=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_compiler_ok_on_s390x" >&5
$as_echo "$libc_cv_compiler_ok_on_s390x" >&6; }
if test "$libc_cv_compiler_ok_on_s390x" != yes; then
critic_missing="$critic_missing On s390x, GCC >= 7.1.0 is required."
fi
test -n "$critic_missing" && as_fn_error $? "
*** $critic_missing" "$LINENO" 5

View file

@ -212,5 +212,22 @@ then
AC_DEFINE(HAVE_S390_MIN_ARCH13_ZARCH_ASM_SUPPORT)
fi
dnl test if GCC is new enough. See gcc "Bug 98269 - gcc 6.5.0
dnl __builtin_add_overflow() with small uint32_t values incorrectly detects
dnl overflow
dnl (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98269)
AC_CACHE_CHECK([if $CC is sufficient to build libc on s390x],
libc_cv_compiler_ok_on_s390x, [
AC_TRY_COMPILE([], [
#if !defined __GNUC__ || __GNUC__ < 7 || (__GNUC__ == 7 && __GNUC_MINOR__ < 1)
#error insufficient compiler for building on s390x
#endif
],
[libc_cv_compiler_ok_on_s390x=yes],
[libc_cv_compiler_ok_on_s390x=no])])
if test "$libc_cv_compiler_ok_on_s390x" != yes; then
critic_missing="$critic_missing On s390x, GCC >= 7.1.0 is required."
fi
test -n "$critic_missing" && AC_MSG_ERROR([
*** $critic_missing])