https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116159

            Bug ID: 116159
           Summary: undefined symbol: _ZSt21ios_base_library_initv with
                    mingw/i686+lld
           Product: gcc
           Version: 14.1.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: schueller at phimeca dot com
  Target Milestone: ---

It would seem the "_ZSt21ios_base_library_initv" symbol from
libstdc++-v3/include/std/iostream is missing one leading underscore for the
i386/windows environment
(it has only one for the itanium c++ ABI):

#if !(_GLIBCXX_USE_INIT_PRIORITY_ATTRIBUTE \
      && __has_attribute(__init_priority__))
  static ios_base::Init __ioinit;
#elif defined(_GLIBCXX_SYMVER_GNU)
  __extension__ __asm (".globl _ZSt21ios_base_library_initv");
#endif


this causes the lld linker to reject the input (but not GNU ld):
#include <fstream>
#include <iostream>
#include <ostream>

int foo() {
  std::ofstream file("/tmp/a.log");
  return 0;
}

$ i686-w64-mingw32-g++ -fuse-ld=lld foo.cxx -shared -o libfoo.dll
-Wl,--out-implib,libfoo.dll.a
ld.lld: error: undefined symbol: _ZSt21ios_base_library_initv
>>> referenced by /tmp/ccV85ZXq.o
collect2: error: ld returned 1 exit status


see here for my report at lld and the detailed answer
https://github.com/llvm/llvm-project/issues/99286

we see in the actual libs that there are two:
$ i686-w64-mingw32-nm /usr/i686-w64-mingw32/sys-root/mingw/lib/libstdc++.dll.a
| grep _ZSt21ios_base_library_initv
00000000 T __ZSt21ios_base_library_initv
00000000 I __imp___ZSt21ios_base_library_initv
$ i686-w64-mingw32-nm /usr/i686-w64-mingw32/sys-root/mingw/lib/libstdc++.a |
grep _ZSt21ios_base_library_initv
00000000 T __ZSt21ios_base_library_initv

it was suggested that __USER_LABEL_PREFIX__ should be used here,
so I tried patch it with:

diff --git a/libstdc++-v3/include/std/iostream
b/libstdc++-v3/include/std/iostream
index 0c6a2d8a4b3..6bfb7e25271 100644
--- a/libstdc++-v3/include/std/iostream
+++ b/libstdc++-v3/include/std/iostream
@@ -79,7 +79,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       && __has_attribute(__init_priority__))
   static ios_base::Init __ioinit;
 #elif defined(_GLIBCXX_SYMVER_GNU)
-  __extension__ __asm (".globl _ZSt21ios_base_library_initv");
+  #define XSTRINGIFY(X) STRINGIFY(X)
+  #define STRINGIFY(X) #X
+  __extension__ __asm (".globl " XSTRINGIFY(__USER_LABEL_PREFIX__)
"_ZSt21ios_base_library_initv");
 #endif


and that fixed the link step with lld for mingw/i686

Reply via email to