From: Jonathan Wakely Date: Tue, 10 Sep 2024 13:36:26 +0000 (+0100) Subject: libstdc++: Only use std::ios_base_library_init() for ELF [PR116159] X-Git-Tag: basepoints/gcc-16~5977 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fc7a1fb0238e379d466316aa219734ac61f4bc0e;p=thirdparty%2Fgcc.git libstdc++: Only use std::ios_base_library_init() for ELF [PR116159] The undefined std::ios_base_library_init() symbol that is referenced by is only supposed to be used for targets where symbol versioning is supported. The mingw-w64 target defaults to --enable-symvers=gnu due to using GNU ld but doesn't actually support symbol versioning. This means it tries to emit references to the std::ios_base_library_init() symbol, which isn't really defined in the library. This causes problems when using lld to link user binaries. Disable the undefined symbol reference for non-ELF targets. libstdc++-v3/ChangeLog: PR libstdc++/116159 * include/std/iostream (ios_base_library_init): Only define for ELF targets. * src/c++98/ios_init.cc (ios_base_library_init): Likewise. --- diff --git a/libstdc++-v3/include/std/iostream b/libstdc++-v3/include/std/iostream index 4f4fa6880d5..4a6dc584d38 100644 --- a/libstdc++-v3/include/std/iostream +++ b/libstdc++-v3/include/std/iostream @@ -78,7 +78,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #if !(_GLIBCXX_USE_INIT_PRIORITY_ATTRIBUTE \ && __has_attribute(__init_priority__)) static ios_base::Init __ioinit; -#elif defined(_GLIBCXX_SYMVER_GNU) +#elif defined(_GLIBCXX_SYMVER_GNU) && defined(__ELF__) __extension__ __asm (".globl _ZSt21ios_base_library_initv"); #endif diff --git a/libstdc++-v3/src/c++98/ios_init.cc b/libstdc++-v3/src/c++98/ios_init.cc index 1422e20d940..6e2e5014cf0 100644 --- a/libstdc++-v3/src/c++98/ios_init.cc +++ b/libstdc++-v3/src/c++98/ios_init.cc @@ -199,7 +199,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return __ret; } -#ifdef _GLIBCXX_SYMVER_GNU +#if defined(_GLIBCXX_SYMVER_GNU) && defined(__ELF__) #pragma GCC diagnostic ignored "-Wattribute-alias" void ios_base_library_init (void)