[cfe-dev] [MinGW] Clang issues with static libstdc++

Mateusz MikuĊ‚a via cfe-dev cfe-dev at lists.llvm.org
Mon Apr 17 11:06:32 PDT 2017


Clang doesn't work very well with static libstdc++ build for MinGW
resulting in "multiple definition ..." or "undefined reference" to the
symbols.

Let's consider following code (removed includes and main for readability):

 1. multiple definition:

    std::string a = "a";
    std::string b = '@'+ a;

    This simple code build with `-static` flag will cause this error:

    D:\msys64\mingw64\lib\gcc\x86_64-w64-mingw32\6.3.0\libstdc++.a(string-inst.o):(.text$_ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EES5_RKS8_[_ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EES5_RKS8_]+0x0):
    multiple definition of `std::__cxx11::basic_string<char,
    std::char_traits<char>, std::allocator<char> > std::operator+<char,
    std::char_traits<char>, std::allocator<char> >(char,
    std::__cxx11::basic_string<char, std::char_traits<char>,
    std::allocator<char> > const&)'
    D:\msys64\tmp\string-e39e30.o:(.text[_ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EES5_RKS8_]+0x0):
    first defined here
    clang++.exe: error: linker command failed with exit code 1 (use -v
    to see invocation)

 2. undefined reference

    std::u16string b;

    This time adding `-static` to clang arguments will cause this error
    (note: `__imp___cxa_call_unexpected` exists only in dynamic libstdc++):

    D:\msys64\tmp\string-7062fd.o:(.text[_ZNSt7__cxx1112basic_stringIDsSt11char_traitsIDsESaIDsEED2Ev]+0x4a):
    undefined reference to `__imp___cxa_call_unexpected'
    D:\msys64\tmp\string-7062fd.o:(.text[__clang_call_terminate]+0x7):
    undefined reference to `__imp___cxa_begin_catch'
    D:\msys64\tmp\string-7062fd.o:(.text[_ZNSt7__cxx1112basic_stringIDsSt11char_traitsIDsESaIDsEE10_M_destroyEy]+0x72):
    undefined reference to `__imp___cxa_call_unexpected'
    clang++.exe: error: linker command failed with exit code 1 (use -v
    to see invocation)

It is probably related to the way the symbols are build into static
libstdc++ for MinGW.
Let's take a look at weak symbol from different test cases:

 1. MinGW, dynamic libstdc++:
    0000000000000000 I
    __imp__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag
    0000000000000000 T
    _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag

 2. MinGW, static libstdc++:
    0000000000000000 p
    .pdata$_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag
    0000000000000000 t
    .text$_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag
    0000000000000000 r
    .xdata$_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag
    0000000000000000 T
    _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag

 3. Linux, static libstdc++:
    0000000000000000 W
    _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag

This greatly reduces Clang usefulness on Windows with MinGW.
All responses are welcome.

Best Regards,
Mateusz

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20170417/c11f513e/attachment.html>


More information about the cfe-dev mailing list