[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