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

Mateusz Mikuła via cfe-dev cfe-dev at lists.llvm.org
Sun Jun 25 13:20:33 PDT 2017


I've been quite busy lately and lost track on recent fixes.Is there any
progress on this or should I apply for bugzilla account and forward it
there?
On Mon, 2017-04-17 at 11∶56 -0700, Reid Kleckner wrote:
> The __imp___cxa_begin_catch error seems related to this code
> in CodeGenModule::CreateRuntimeFunction:      if (!Local &&
> getTriple().isOSBinFormatCOFF() &&
>           !getCodeGenOpts().LTOVisibilityPublicStd) {
>         const FunctionDecl *FD = GetRuntimeFunctionDecl(Context,
> Name);
>         if (!FD || FD->hasAttr<DLLImportAttr>()) {
>           F-
> >setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
>           F->setLinkage(llvm::GlobalValue::ExternalLinkage);
>         }
>       }
> 
> This code assumes that all compiler-referenced runtime functions on
> COFF are dllimport, unless we happen to see a prototype for them
> during compilation that says otherwise. Saleem felt we shouldn't rely
> on the import thunks that the linker generates when you reference an
> imported function but forget to declare it as dllimport during
> compilation. It has some performance benefits, but it never really
> bothered me. Most users don't complain about the extra absolute
> branch imposed by the PLT on ELF, and those that do are getting -fno-
> plt soon.
> 
> Anyway, you can see the code difference easily here:
> 
> $ cat t.cpp
> void g();
> void f() {
>   try {
>     g();
>   } catch (...) {
>   }
> }
> 
> $ clang -O1 -S t.cpp --target=x86_64-windows-gnu -o - | grep __cxa
>         callq   *__imp___cxa_begin_catch(%rip)
>         rex64 jmpq      *__imp___cxa_end_catch(%rip) # TAILCALL
> 
> $ gcc -O1 -S t.cpp -o - | grep __cxa
>         call    __cxa_begin_catch
>         call    __cxa_end_catch
>         .def    __cxa_begin_catch;      .scl    2;      .type   32;  
>   .endef
>         .def    __cxa_end_catch;        .scl    2;      .type   32;  
>   .endef
> 
> The other error looks like some kind of COMDAT disagreement between
> GCC and Clang that will require further investigation. It might
> relate to our choice to stop using ".text$function_name" for the
> section.
> On Mon, Apr 17, 2017 at 11:06 AM, Mateusz Mikuła via cfe-dev <cfe-dev
> @lists.llvm.org> wrote:
> >   
> >     
> >   
> >   
> >     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):
> >     
> >       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_s
> > tringIT_T0_T1_EES5_RKS8_[_ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1
> > 112basic_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)
> > 
> >         
> > 
> >       
> >       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_traitsIDsESa
> > IDsEED2Ev]+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_traitsIDsESa
> > IDsEE10_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:
> >     
> >       MinGW, dynamic libstdc++:
> > 
> >         0000000000000000 I
> > __imp__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_con
> > structIPKcEEvT_S8_St20forward_iterator_tag
> > 
> >         0000000000000000 T
> > _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_construct
> > IPKcEEvT_S8_St20forward_iterator_tag
> > 
> >         
> > 
> >       
> >       MinGW, static libstdc++:
> > 
> >         0000000000000000 p
> > .pdata$_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_co
> > nstructIPKcEEvT_S8_St20forward_iterator_tag
> > 
> >         0000000000000000 t
> > .text$_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_con
> > structIPKcEEvT_S8_St20forward_iterator_tag
> > 
> >         0000000000000000 r
> > .xdata$_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_co
> > nstructIPKcEEvT_S8_St20forward_iterator_tag
> > 
> >         0000000000000000 T
> > _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_construct
> > IPKcEEvT_S8_St20forward_iterator_tag
> > 
> >         
> > 
> >       
> >       Linux, static libstdc++:
> > 
> >         0000000000000000 W
> > _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_construct
> > IPKcEEvT_S8_St20forward_iterator_tag
> >     
> >     This greatly reduces Clang usefulness on Windows with MinGW.
> > 
> >       All responses are welcome.
> >     Best Regards,
> > 
> >       Mateusz
> > 
> >     
> >   
> > 
> > 
> > _______________________________________________
> > 
> > cfe-dev mailing list
> > 
> > cfe-dev at lists.llvm.org
> > 
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
> > 
> > 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20170625/1629d24e/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20170625/1629d24e/attachment.sig>


More information about the cfe-dev mailing list