diff mbox series

Add --enable-static-c++-link-check option [BZ #31412]

Message ID 20240524215746.1212197-1-hjl.tools@gmail.com
State New
Headers show
Series Add --enable-static-c++-link-check option [BZ #31412] | expand

Commit Message

H.J. Lu May 24, 2024, 9:57 p.m. UTC
The current minimum GCC version of glibc build is GCC 6.2 or newer.  When
building i686 glibc on Fedora 40, GCC 6.4 failed the static C++ link test
since the 32-bit libc.a was built with GCC 14 and has references to
__divmoddi4 which was added to GCC 7.  Add --enable-static-c++-link-check
configure option which is on by default.  --disable-static-c++-link-check
can be used to disable the static C++ link test.  The newly built i686
libc.a can be used by GCC 6.4 to create static C++ tests.  This fixes
BZ #31412.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
---
 configure    | 24 +++++++++++++++++++-----
 configure.ac | 22 +++++++++++++++-------
 2 files changed, 34 insertions(+), 12 deletions(-)

Comments

Florian Weimer May 25, 2024, 9:54 a.m. UTC | #1
* H. J. Lu:

> The current minimum GCC version of glibc build is GCC 6.2 or newer.  When
> building i686 glibc on Fedora 40, GCC 6.4 failed the static C++ link test
> since the 32-bit libc.a was built with GCC 14 and has references to
> __divmoddi4 which was added to GCC 7.  Add --enable-static-c++-link-check
> configure option which is on by default.  --disable-static-c++-link-check
> can be used to disable the static C++ link test.  The newly built i686
> libc.a can be used by GCC 6.4 to create static C++ tests.  This fixes
> BZ #31412.

But won't there still be tons of test suite failures?

Even CXX=no will not work because in some configurations, it's actually
libgcc_s.so.1 that can't be loaded, and that breaks pthread_cancel.

Thanks,
Florian
H.J. Lu May 25, 2024, 10:44 a.m. UTC | #2
On Sat, May 25, 2024 at 2:54 AM Florian Weimer <fweimer@redhat.com> wrote:
>
> * H. J. Lu:
>
> > The current minimum GCC version of glibc build is GCC 6.2 or newer.  When
> > building i686 glibc on Fedora 40, GCC 6.4 failed the static C++ link test
> > since the 32-bit libc.a was built with GCC 14 and has references to
> > __divmoddi4 which was added to GCC 7.  Add --enable-static-c++-link-check
> > configure option which is on by default.  --disable-static-c++-link-check
> > can be used to disable the static C++ link test.  The newly built i686
> > libc.a can be used by GCC 6.4 to create static C++ tests.  This fixes
> > BZ #31412.
>
> But won't there still be tons of test suite failures?

I only saw

FAIL: misc/tst-pidfd
FAIL: misc/tst-pidfd_getpid

with GCC 6.4.  I will check if it is a testcase issue.

> Even CXX=no will not work because in some configurations, it's actually
> libgcc_s.so.1 that can't be loaded, and that breaks pthread_cancel.
>

c++ still works.  Only "c++ -static" doesn't work with the system libc.a.
Florian Weimer May 25, 2024, 4:07 p.m. UTC | #3
* H. J. Lu:

> On Sat, May 25, 2024 at 2:54 AM Florian Weimer <fweimer@redhat.com> wrote:
>>
>> * H. J. Lu:
>>
>> > The current minimum GCC version of glibc build is GCC 6.2 or newer.  When
>> > building i686 glibc on Fedora 40, GCC 6.4 failed the static C++ link test
>> > since the 32-bit libc.a was built with GCC 14 and has references to
>> > __divmoddi4 which was added to GCC 7.  Add --enable-static-c++-link-check
>> > configure option which is on by default.  --disable-static-c++-link-check
>> > can be used to disable the static C++ link test.  The newly built i686
>> > libc.a can be used by GCC 6.4 to create static C++ tests.  This fixes
>> > BZ #31412.
>>
>> But won't there still be tons of test suite failures?
>
> I only saw
>
> FAIL: misc/tst-pidfd
> FAIL: misc/tst-pidfd_getpid
>
> with GCC 6.4.  I will check if it is a testcase issue.
>
>> Even CXX=no will not work because in some configurations, it's actually
>> libgcc_s.so.1 that can't be loaded, and that breaks pthread_cancel.
>>
>
> c++ still works.  Only "c++ -static" doesn't work with the system libc.a.

I think you'll see the issue if you go back further, to the 2.34 branch.

Thanks,
Florian
H.J. Lu May 25, 2024, 4:14 p.m. UTC | #4
On Sat, May 25, 2024 at 9:08 AM Florian Weimer <fweimer@redhat.com> wrote:
>
> * H. J. Lu:
>
> > On Sat, May 25, 2024 at 2:54 AM Florian Weimer <fweimer@redhat.com> wrote:
> >>
> >> * H. J. Lu:
> >>
> >> > The current minimum GCC version of glibc build is GCC 6.2 or newer.  When
> >> > building i686 glibc on Fedora 40, GCC 6.4 failed the static C++ link test
> >> > since the 32-bit libc.a was built with GCC 14 and has references to
> >> > __divmoddi4 which was added to GCC 7.  Add --enable-static-c++-link-check
> >> > configure option which is on by default.  --disable-static-c++-link-check
> >> > can be used to disable the static C++ link test.  The newly built i686
> >> > libc.a can be used by GCC 6.4 to create static C++ tests.  This fixes
> >> > BZ #31412.
> >>
> >> But won't there still be tons of test suite failures?
> >
> > I only saw
> >
> > FAIL: misc/tst-pidfd
> > FAIL: misc/tst-pidfd_getpid

It is a glibc bug.  I submitted a patch:

https://patchwork.sourceware.org/project/glibc/list/?series=34355

> > with GCC 6.4.  I will check if it is a testcase issue.
> >
> >> Even CXX=no will not work because in some configurations, it's actually
> >> libgcc_s.so.1 that can't be loaded, and that breaks pthread_cancel.
> >>
> >
> > c++ still works.  Only "c++ -static" doesn't work with the system libc.a.
>
> I think you'll see the issue if you go back further, to the 2.34 branch.
>

I set up LD_LIBRARY_PATH to GCC 6.4 run-time libraries and only saw

FAIL: nptl/tst-pthread-gdb-attach
FAIL: nptl/tst-pthread-gdb-attach-static

which is caused by gdb dependency on GCC 14 run-time libraries.

--disable-static-c++-link-check together with --disable-static-c++-tests
allow me to test ppc64le glibc on GCC compiler farm.
Florian Weimer May 26, 2024, 2:07 p.m. UTC | #5
* H. J. Lu:

>> > with GCC 6.4.  I will check if it is a testcase issue.
>> >
>> >> Even CXX=no will not work because in some configurations, it's actually
>> >> libgcc_s.so.1 that can't be loaded, and that breaks pthread_cancel.
>> >>
>> >
>> > c++ still works.  Only "c++ -static" doesn't work with the system libc.a.
>>
>> I think you'll see the issue if you go back further, to the 2.34 branch.
>>
>
> I set up LD_LIBRARY_PATH to GCC 6.4 run-time libraries and only saw
>
> FAIL: nptl/tst-pthread-gdb-attach
> FAIL: nptl/tst-pthread-gdb-attach-static
>
> which is caused by gdb dependency on GCC 14 run-time libraries.
>
> --disable-static-c++-link-check together with --disable-static-c++-tests
> allow me to test ppc64le glibc on GCC compiler farm.

Has this GCC 6.4 been built against system glibc?

The use case for what you are trying to do seems to be really narrow to
me.  In general, building a fresh glibc against system glibc will not
result in a GCC that is compatible with the (earlier) glibc under
development.  GCC before 12 probably has it a lot easier.

Thanks,
Florian
H.J. Lu May 26, 2024, 2:26 p.m. UTC | #6
On Sun, May 26, 2024 at 7:08 AM Florian Weimer <fweimer@redhat.com> wrote:
>
> * H. J. Lu:
>
> >> > with GCC 6.4.  I will check if it is a testcase issue.
> >> >
> >> >> Even CXX=no will not work because in some configurations, it's actually
> >> >> libgcc_s.so.1 that can't be loaded, and that breaks pthread_cancel.
> >> >>
> >> >
> >> > c++ still works.  Only "c++ -static" doesn't work with the system libc.a.
> >>
> >> I think you'll see the issue if you go back further, to the 2.34 branch.
> >>
> >
> > I set up LD_LIBRARY_PATH to GCC 6.4 run-time libraries and only saw
> >
> > FAIL: nptl/tst-pthread-gdb-attach
> > FAIL: nptl/tst-pthread-gdb-attach-static
> >
> > which is caused by gdb dependency on GCC 14 run-time libraries.
> >
> > --disable-static-c++-link-check together with --disable-static-c++-tests
> > allow me to test ppc64le glibc on GCC compiler farm.
>
> Has this GCC 6.4 been built against system glibc?

No.  GCC 6.4 binaries were built years agao.

> The use case for what you are trying to do seems to be really narrow to
> me.  In general, building a fresh glibc against system glibc will not
> result in a GCC that is compatible with the (earlier) glibc under
> development.  GCC before 12 probably has it a lot easier.
>

I used GCC 6.4 on Fedora 40 to verify that glibc source is buildable with
GCC 6 and I discovered a glibc bug:

https://sourceware.org/bugzilla/show_bug.cgi?id=31798
diff mbox series

Patch

diff --git a/configure b/configure
index 432e40a592..58e82d792d 100755
--- a/configure
+++ b/configure
@@ -778,6 +778,7 @@  ac_user_opts='
 enable_option_checking
 with_pkgversion
 with_bugurl
+enable_static_c___link_check
 with_gd
 with_gd_include
 with_gd_lib
@@ -1447,6 +1448,8 @@  Optional Features:
   --disable-option-checking  ignore unrecognized --enable/--with options
   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-static-c++-link-check
+                          enable static C++ link check [default=yes]
   --disable-sanity-checks really do not use threads (should not be used except
                           in special situations) [default=yes]
   --enable-shared         build shared library [default=yes if GNU ld]
@@ -3810,6 +3813,15 @@  if test -z "$CPP"; then
 fi
 
 
+# Check whether --enable-static-c++-link-check was given.
+if test ${enable_static_c___link_check+y}
+then :
+  enableval=$enable_static_c___link_check; static_cxx_link_check=$enableval
+else $as_nop
+  static_cxx_link_check=yes
+fi
+
+
 # We need the C++ compiler only for testing.
 
 
@@ -4220,10 +4232,11 @@  else $as_nop
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.beam \
     conftest$ac_exeext conftest.$ac_ext
-# Static case.
-old_LDFLAGS="$LDFLAGS"
-LDFLAGS="$LDFLAGS -static"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+if test $static_cxx_link_check = yes; then
+  # Static case.
+  old_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS -static"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 #include <iostream>
@@ -4244,7 +4257,8 @@  else $as_nop
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.beam \
     conftest$ac_exeext conftest.$ac_ext
-LDFLAGS="$old_LDFLAGS"
+  LDFLAGS="$old_LDFLAGS"
+fi
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
diff --git a/configure.ac b/configure.ac
index bdc385d03c..12de4c3d15 100644
--- a/configure.ac
+++ b/configure.ac
@@ -52,6 +52,12 @@  fi
 AC_SUBST(cross_compiling)
 AC_PROG_CPP
 
+AC_ARG_ENABLE([static-c++-link-check],
+	      AS_HELP_STRING([--enable-static-c++-link-check],
+			     [enable static C++ link check @<:@default=yes@:>@]),
+	      [static_cxx_link_check=$enableval],
+	      [static_cxx_link_check=yes])
+
 # We need the C++ compiler only for testing.
 AC_PROG_CXX
 # It's useless to us if it can't link programs (e.g. missing -lstdc++).
@@ -61,10 +67,11 @@  AC_LANG_PUSH([C++])
 AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])],
 	       [libc_cv_cxx_link_ok=yes],
 	       [libc_cv_cxx_link_ok=no])
-# Static case.
-old_LDFLAGS="$LDFLAGS"
-LDFLAGS="$LDFLAGS -static"
-AC_LINK_IFELSE([AC_LANG_SOURCE([
+if test $static_cxx_link_check = yes; then
+  # Static case.
+  old_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS -static"
+  AC_LINK_IFELSE([AC_LANG_SOURCE([
 #include <iostream>
 
 int
@@ -74,9 +81,10 @@  main()
   return 0;
 }
 ])],
-	       [],
-	       [libc_cv_cxx_link_ok=no])
-LDFLAGS="$old_LDFLAGS"
+		 [],
+		 [libc_cv_cxx_link_ok=no])
+  LDFLAGS="$old_LDFLAGS"
+fi
 AC_LANG_POP([C++])])
 AS_IF([test $libc_cv_cxx_link_ok != yes], [CXX=])