s390x: Require GCC 7.1 or later to build glibc.

Message ID 20201215141803.252050-1-stli@linux.ibm.com
State Committed
Commit 844b4d8b4b937fe6943d2c0c80ce7d871cdb1eb5
Headers
Series s390x: Require GCC 7.1 or later to build glibc. |

Commit Message

Stefan Liebler Dec. 15, 2020, 2:18 p.m. UTC
  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)
---
 INSTALL                   |  3 +++
 NEWS                      |  2 ++
 manual/install.texi       |  2 ++
 sysdeps/s390/configure    | 35 +++++++++++++++++++++++++++++++++++
 sysdeps/s390/configure.ac | 17 +++++++++++++++++
 5 files changed, 59 insertions(+)
  

Comments

stli Dec. 17, 2020, 3:19 p.m. UTC | #1
On 2020-12-15 15:18, Stefan Liebler wrote:
> 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)
> ---
>  INSTALL                   |  3 +++
>  NEWS                      |  2 ++
>  manual/install.texi       |  2 ++
>  sysdeps/s390/configure    | 35 +++++++++++++++++++++++++++++++++++
>  sysdeps/s390/configure.ac | 17 +++++++++++++++++
>  5 files changed, 59 insertions(+)
> 
> diff --git a/INSTALL b/INSTALL
> index 2b00f80df5..accdc39821 100644
> --- a/INSTALL
> +++ b/INSTALL
> @@ -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
> diff --git a/NEWS b/NEWS
> index 0820984547..86e05fb023 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -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
> diff --git a/manual/install.texi b/manual/install.texi
> index 2e164476d5..648f366371 100644
> --- a/manual/install.texi
> +++ b/manual/install.texi
> @@ -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
> diff --git a/sysdeps/s390/configure b/sysdeps/s390/configure
> index fa46e9e351..5f98640d0f 100644
> --- a/sysdeps/s390/configure
> +++ b/sysdeps/s390/configure
> @@ -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
> diff --git a/sysdeps/s390/configure.ac b/sysdeps/s390/configure.ac
> index 3ed5a8ef87..dfe007a774 100644
> --- a/sysdeps/s390/configure.ac
> +++ b/sysdeps/s390/configure.ac
> @@ -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])

Committed.

Bye,
Stefan
  
Adhemerval Zanella Dec. 17, 2020, 5:35 p.m. UTC | #2
On 15/12/2020 11:18, Stefan Liebler via Libc-alpha wrote:
> 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)

I don't have a strong preference, but one option would be to add a
workaround on include/intprops.h and use INT_ADD_OVERFLOW instead
(it should use __builtins where appropriated). 

In any case, it would be good to alert gnulib developers about this
potential issue.

From the bug report, it seems that only s390 is affected, right?
  
Stefan Liebler Dec. 18, 2020, 9:08 a.m. UTC | #3
On 12/17/20 6:35 PM, Adhemerval Zanella wrote:
> On 15/12/2020 11:18, Stefan Liebler via Libc-alpha wrote:
>> 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)
> 
> I don't have a strong preference, but one option would be to add a
> workaround on include/intprops.h and use INT_ADD_OVERFLOW instead
> (it should use __builtins where appropriated). 
As __builtin_add_overflow is also used at other places, I would prefer
to exclude gcc 6.5.0.

A side information:
Currently <glibc>/configure.ac is requiring gcc 6.2 and there are others
archs which already require more recent gcc version.

> 
> In any case, it would be good to alert gnulib developers about this
> potential issue.
I've sent an email to bug-gnulib@gnu.org:
https://lists.gnu.org/archive/html/bug-gnulib/2020-12/msg00152.html

> 
> From the bug report, it seems that only s390 is affected, right?
> 
As far as I know, yes. I've asked Florian, but he has not recognized
such an error on other archs. Andreas has mentioned two gcc commits:

"The failure disappears with:"
gcc commit "S/390: Add support for z13 instructions lochi and locghi."
https://gcc.gnu.org/git/?p=gcc.git&a=commit;h=bf7499197fbb065123257c374064f6bb715c951b
"But that one only hides the problem."

"Reverting the patch and continue bisecting. The failure finally
disappears with:"
gcc commit "re PR rtl-optimization/78559 (wrong code due to tree
if-conversion?)"
https://gcc.gnu.org/git/?p=gcc.git&a=commit;h=3f54004b095d1cd513e63753ee0f8f9f13698347

Thanks,
Stefan
  

Patch

diff --git a/INSTALL b/INSTALL
index 2b00f80df5..accdc39821 100644
--- a/INSTALL
+++ b/INSTALL
@@ -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
diff --git a/NEWS b/NEWS
index 0820984547..86e05fb023 100644
--- a/NEWS
+++ b/NEWS
@@ -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
diff --git a/manual/install.texi b/manual/install.texi
index 2e164476d5..648f366371 100644
--- a/manual/install.texi
+++ b/manual/install.texi
@@ -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
diff --git a/sysdeps/s390/configure b/sysdeps/s390/configure
index fa46e9e351..5f98640d0f 100644
--- a/sysdeps/s390/configure
+++ b/sysdeps/s390/configure
@@ -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
diff --git a/sysdeps/s390/configure.ac b/sysdeps/s390/configure.ac
index 3ed5a8ef87..dfe007a774 100644
--- a/sysdeps/s390/configure.ac
+++ b/sysdeps/s390/configure.ac
@@ -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])