GCC 6.5 fails to correctly build ldconfig with recent ld.so.cache
commits, e.g.:
785969a047ad2f23f758901c6816422573544453
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)
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
(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
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
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
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])