[PATCH v2] libstdc++: Add module initialization functions to the library [PR124268]
Jonathan Wakely
jwakely@redhat.com
Tue Mar 17 11:19:23 GMT 2026
On Tue, 17 Mar 2026 at 11:13, Jonathan Wakely <jwakely@redhat.com> wrote:
>
> On Tue, 17 Mar 2026 at 10:13, Gerald Pfeifer <gerald@pfeifer.com> wrote:
> >
> > On Mon, 16 Mar 2026, Jonathan Wakely wrote:
> > > This ensures that the module init functions are present in libstdc++.so
> > > and libstdc++.a, so that users of the std and std.compat modules don't
> > > need to manually link to std.o and/or std.compat.o in addition to
> > > compiling the CMIs.
> > :
> > > libstdc++-v3/ChangeLog:
> > >
> > > PR libstdc++/124268
> > > * config/abi/pre/gnu.ver: Export symbols.
> > > * src/Makefile.am: Add libmodulesconvenience.la to libstdc++
> > > link.
> > > * src/Makefile.in: Regenerate.
> > > * src/c++23/Makefile.am: Create libmodulesconvenience.la
> > > and populate it with std.o and std.compat.o interface units.
> > > Add clean-local target.
> > > * src/c++23/Makefile.in: Regenerate.
> >
> > It looks like this broke bootstrap on FreeBSD 13/amd64:
> >
> > libtool: link: ( cd ".libs" && rm -f "libc++23convenience.la" && ln -s "../libc++23convenience.la" "libc++23convenience.la" )
> > std.cc:3799:14: error: exporting 'int feclearexcept(int)' that does not have external linkage
> > 3799 | using std::feclearexcept;
> > | ^~~~~~~~~~~~~
> > In file included from /scratch/tmp/gerald/OBJ-0317-0208/x86_64-unknown-freebsd13.5/libstdc++-v3/include/fenv.h:41,
> > from /scratch/tmp/gerald/OBJ-0317-0208/x86_64-unknown-freebsd13.5/libstdc++-v3/include/cfenv:43,
> > from /scratch/tmp/gerald/OBJ-0317-0208/x86_64-unknown-freebsd13.5/libstdc++-v3/include/x86_64-unknown-freebsd13.5/bits/stdc++.h:123,
> > from std.cc:26:
> > /usr/include/fenv.h:265:1: note: 'int feclearexcept(int)' declared here with internal linkage
> > 265 | feclearexcept(int __excepts)
> > | ^~~~~~~~~~~~~
> > std.cc:3801:14: error: exporting 'int fegetexceptflag(fexcept_t*, int)' that does not have external linkage
> > 3801 | using std::fegetexceptflag;
> > | ^~~~~~~~~~~~~~~
> > /usr/include/fenv.h:283:1: note: 'int fegetexceptflag(fexcept_t*, int)' declared here with internal linkage
> > 283 | fegetexceptflag(fexcept_t *__flagp, int __excepts)
> > | ^~~~~~~~~~~~~~~
> > :
> > gmake[2]: *** [Makefile:17779: all-stage1-target-libstdc++-v3] Error 2
> > gmake[2]: Leaving directory '/scratch/tmp/gerald/OBJ-0317-0208'
> > gmake[1]: *** [Makefile:26906: stage1-bubble] Error 2
> > gmake[1]: Leaving directory '/scratch/tmp/gerald/OBJ-0317-0208'
> > gmake: *** [Makefile:27243: bootstrap] Error 2
> >
> >
> > Looking at /usr/include/fenv.h I see
> >
> > #ifndef __fenv_static
> > #define __fenv_static static
> > #endif
> >
> > :
> >
> > __fenv_static inline int
> > feclearexcept(int __excepts)
> > {
> > :
> > }
> >
> > I also found the same on a FreeBSD 15 system, so it's not just that older
> > release which is going to be EOL in two months.
>
> I'm pretty sure this is not conforming to the C standard:
> https://cigix.me/c23#7.1.2.p8
>
> This is going to be a problem for anybody trying to use the 'std'
> module on FreeBSD, it seems like I'm just the first person to ever try
> it :-)
>
> We might need to use fixincludes here.
Actually we do install our own wrapper of fenv.h so we could just do:
--- a/libstdc++-v3/config/os/bsd/freebsd/os_defines.h
+++ b/libstdc++-v3/config/os/bsd/freebsd/os_defines.h
@@ -53,4 +53,8 @@
// read(2) can return EINVAL for n >= INT_MAX.
#define _GLIBCXX_MAX_READ_SIZE (__INT_MAX__ - 1)
+// Ensure that inline functions in <fenv.h> have external linkage.
+#undef __fenv_static
+#define __fenv_static
+
#endif
(either in os_defines.h or in fenv.h)
More information about the Libstdc++
mailing list