Message ID | 20201215141803.252050-1-stli@linux.ibm.com |
---|---|
State | New |
Headers | show |
Series | s390x: Require GCC 7.1 or later to build glibc. | expand |
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
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?
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
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])