The linker script assumes that std::mbstate_t has the name __mbstate_t for linkage purposes, but that's not necessarily true. For mingw32 it's just a typedef for int, so the patterns don't match.
This adds a new mingw32-specific pattern for codecvt_byname's constructors and destructors, and relaxes the patterns for codecvt<charNN_t, char, mbstate_t> so they match __mbstate_t or int. Tested x86_64-linux and powerpc64le-linux, committed to trunk. I plan to commit this to trunk and gcc-5-branch soon.
commit dffce5e2b48ff19c4ec4de5d7ca934c15225b940 Author: Jonathan Wakely <jwak...@redhat.com> Date: Mon Jun 1 17:31:46 2015 +0100 PR libstdc++/66030 * config/abi/pre/gnu.ver: Export codecvt_byname and codecvt symbols for mingw32. diff --git a/libstdc++-v3/config/abi/pre/gnu.ver b/libstdc++-v3/config/abi/pre/gnu.ver index 2da04e4..d42cd37 100644 --- a/libstdc++-v3/config/abi/pre/gnu.ver +++ b/libstdc++-v3/config/abi/pre/gnu.ver @@ -542,6 +542,9 @@ GLIBCXX_3.4 { # std::codecvt_byname _ZNSt14codecvt_bynameI[cw]c11__mbstate_tEC[12]EPKc[jmy]; _ZNSt14codecvt_bynameI[cw]c11__mbstate_tED*; +#if defined (_WIN32) && !defined (__CYGWIN__) + _ZNSt14codecvt_bynameI[cw]ciE[CD]*; +#endif # std::collate _ZNSt7collateI[cw]*; @@ -1821,9 +1824,9 @@ GLIBCXX_3.4.21 { _ZNKSt8time_getI[cw]St19istreambuf_iteratorI[cw]St11char_traitsI[cw]EEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tmcc; # codecvt<char16_t, char, mbstate_t>, codecvt<char32_t, char, mbstate_t> - _ZNKSt7codecvtID[is]c11__mbstate_t*; - _ZNSt7codecvtID[is]c11__mbstate_t*; - _ZT[ISV]St7codecvtID[is]c11__mbstate_tE; + _ZNKSt7codecvtID[is]c*; + _ZNSt7codecvtID[is]c*; + _ZT[ISV]St7codecvtID[is]c*E; extern "C++" {