Here is the fixed patch tested in all 3 modes: - _GLIBCXX_USE_DUAL_ABI - !_GLIBCXX_USE_DUAL_ABI && !_GLIBCXX_USE_CXX11_ABI - !_GLIBCXX_USE_DUAL_ABI && _GLIBCXX_USE_CXX11_ABI I don't know what you have in mind for the change below but I wanted to let you know that I tried to put COW std::basic_string into a nested __cow namespace when _GLIBCXX_USE_CXX11_ABI. But it had more impact on string-inst.cc so I preferred the macro substitution approach. There are some test failing when !_GLIBCXX_USE_CXX11_ABI that are unrelated with my changes. I'll propose fixes in coming days.     libstdc++: [_GLIBCXX_INLINE_VERSION] Use cxx11 abi [PR83077]     Use cxx11 abi when activating versioned namespace mode. To do support     a new configuration mode where !_GLIBCXX_USE_DUAL_ABI and _GLIBCXX_USE_CXX11_ABI.     The main change is that std::__cow_string is now defined whenever _GLIBCXX_USE_DUAL_ABI     or _GLIBCXX_USE_CXX11_ABI is true. Implementation is using available std::string in     case of dual abi and a subset of it when it's not.     On the other side std::__sso_string is defined only when _GLIBCXX_USE_DUAL_ABI is true     and _GLIBCXX_USE_CXX11_ABI is false. Meaning that std::__sso_string is a typedef for the     cow std::string implementation when dual abi is disabled and cow string is being used.     libstdcxx-v3/ChangeLog:             PR libstdc++/83077             * acinclude.m4 [GLIBCXX_ENABLE_LIBSTDCXX_DUAL_ABI]: Default to "new" libstdcxx abi.             * config/locale/dragonfly/monetary_members.cc [!_GLIBCXX_USE_DUAL_ABI]: Define money_base             members.             * config/locale/generic/monetary_members.cc [!_GLIBCXX_USE_DUAL_ABI]: Likewise.             * config/locale/gnu/monetary_members.cc [!_GLIBCXX_USE_DUAL_ABI]: Likewise.             * config/locale/gnu/numeric_members.cc             [!_GLIBCXX_USE_DUAL_ABI](__narrow_multibyte_chars): Define.             * configure: Regenerate.             * include/bits/c++config             [_GLIBCXX_INLINE_VERSION](_GLIBCXX_NAMESPACE_CXX11, _GLIBCXX_BEGIN_NAMESPACE_CXX11):             Define empty. [_GLIBCXX_INLINE_VERSION](_GLIBCXX_END_NAMESPACE_CXX11, _GLIBCXX_DEFAULT_ABI_TAG):             Likewise.             * include/bits/cow_string.h [!_GLIBCXX_USE_CXX11_ABI]: Define a light version of COW             basic_string as __std_cow_string for use in stdexcept.             * include/std/stdexcept [_GLIBCXX_USE_CXX11_ABI]: Define __cow_string.             (__cow_string(const char*)): New.             (__cow_string::c_str()): New.             * python/libstdcxx/v6/printers.py (StdStringPrinter::__init__): Set self.new_string to True             when std::__8::basic_string type is found.             * src/Makefile.am [ENABLE_SYMVERS_GNU_NAMESPACE](ldbl_alt128_compat_sources): Define empty.             * src/Makefile.in: Regenerate.             * src/c++11/Makefile.am (cxx11_abi_sources): Rename into...             (dual_abi_sources): ...this. Also move cow-local_init.cc, cxx11-hash_tr1.cc,             cxx11-ios_failure.cc entries to...             (sources): ...this.             (extra_string_inst_sources): Move cow-fstream-inst.cc, cow-sstream-inst.cc, cow-string-inst.cc,             cow-string-io-inst.cc, cow-wtring-inst.cc, cow-wstring-io-inst.cc, cxx11-locale-inst.cc,             cxx11-wlocale-inst.cc entries to...             (inst_sources): ...this.             * src/c++11/Makefile.in: Regenerate.             * src/c++11/cow-fstream-inst.cc [_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++11/cow-locale_init.cc [_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++11/cow-sstream-inst.cc [_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++11/cow-stdexcept.cc [_GLIBCXX_USE_CXX11_ABI]: Include .             [_GLIBCXX_USE_DUAL_ABI || _GLIBCXX_USE_CXX11_ABI](__cow_string): Redefine before             including . Define _GLIBCXX_DEFINE_STDEXCEPT_INSTANTIATIONS so that             __cow_string definition in is skipped.             [_GLIBCXX_USE_CXX11_ABI]: Skip Transaction Memory TS definitions.             Move static_assert to check std::_cow_string abi layout to...             * src/c++11/string-inst.cc: ...here.             (_GLIBCXX_DEFINING_CXX11_ABI_INSTANTIATIONS): Define following _GLIBCXX_USE_CXX11_ABI             value.             [_GLIBCXX_USE_CXX11_ABI && !_GLIBCXX_DEFINING_CXX11_ABI_INSTANTIATIONS]:             Define _GLIBCXX_DEFINING_COW_STRING_INSTANTIATIONS. Include .             Define basic_string as __std_cow_string for the current translation unit.             * src/c++11/cow-string-inst.cc [_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++11/cow-string-io-inst.cc [_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++11/cow-wstring-inst.cc [_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++11/cow-wstring-io-inst.cc [_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++11/cxx11-hash_tr1.cc [!_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++11/cxx11-ios_failure.cc [!_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             [!_GLIBCXX_USE_DUAL_ABI] (__ios_failure): Remove.             * src/c++11/cxx11-locale-inst.cc: Cleanup, just include locale-inst.cc.             * src/c++11/cxx11-stdexcept.cc [!_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++11/cxx11-wlocale-inst.cc [!_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++11/locale-inst-numeric.h [!_GLIBCXX_USE_DUAL_ABI](std::use_facet>, std::use_facet>): Instantiate. [!_GLIBCXX_USE_DUAL_ABI](std::has_facet>, std::has_facet>): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](std::num_get>): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](std::num_put>): Instantiate.             * src/c++11/locale-inst.cc [!_GLIBCXX_USE_DUAL_ABI]: Build only when configured             _GLIBCXX_USE_CXX11_ABI is equal to currently built abi.             [!_GLIBCXX_USE_DUAL_ABI](__moneypunct_cache): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](__moneypunct_cache): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](__numpunct_cache): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](__timepunct): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](__timepunct_cache): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](time_put>): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](time_put_byname>): Instantiate. [!_GLIBCXX_USE_DUAL_ABI](__ctype_abstract_base): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](ctype_byname): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](__codecvt_abstract_base): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](codecvt_byname): Instantiate. [!_GLIBCXX_USE_DUAL_ABI](use_facet>(const locale&)): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](use_facet>(const locale&)): Instantiate. [!_GLIBCXX_USE_DUAL_ABI](use_facet<__timepunct>(const locale&)): Instantiate. [!_GLIBCXX_USE_DUAL_ABI](use_facet>(const locale&)): Instantiate. [!_GLIBCXX_USE_DUAL_ABI](has_facet>(const locale&)): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](has_facet>(const locale&)): Instantiate. [!_GLIBCXX_USE_DUAL_ABI](has_facet<__timepunct>(const locale&)): Instantiate. [!_GLIBCXX_USE_DUAL_ABI](has_facet>(const locale&)): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](__add_grouping): Define.             [!_GLIBCXX_USE_DUAL_ABI](__pad>): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](__int_to_char(C*, unsigned long, const C*,             ios_base::fmtflags, bool)): Define.             [!_GLIBCXX_USE_DUAL_ABI](__int_to_char(C*, unsigned long long, const C*,             ios_base::fmtflags, bool)): Define.             * src/c++11/wlocale-inst.cc [!_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++98/Makefile.am (cxx11_abi_sources): Remove, unique cow-istream-string.cc entry             move to...             (inst_sources): ...this.             * src/c++98/Makefile.in: Regenerate.             * src/c++98/cow-istream-string.cc: Include .             [_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++98/hash_tr1.cc [_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++98/ios_failure.cc [_GLIBCXX_USE_CXX11_ABI][_GLIBCXX_USE_DUAL_ABI]: Skip definitions.             * src/c++98/istream-string.cc [!_GLIBCXX_USE_DUAL_ABI]: Build only when configured             _GLIBCXX_USE_CXX11_ABI is equal to currently built abi.             * src/c++98/locale_facets.cc [_GLIBCXX_USE_CXX11_ABI](__verify_grouping): Remove.             * src/c++98/stdexcept.cc             [_GLIBCXX_USE_CXX11_ABI](logic_error(const string&): Remove.             [_GLIBCXX_USE_CXX11_ABI](domain_error(const string&): Remove.             [_GLIBCXX_USE_CXX11_ABI](invalid_argument(const string&): Remove.             [_GLIBCXX_USE_CXX11_ABI](length_error(const string&): Remove.             [_GLIBCXX_USE_CXX11_ABI](out_of_range(const string&): Remove.             [_GLIBCXX_USE_CXX11_ABI](runtime_error(const string&): Remove.             [_GLIBCXX_USE_CXX11_ABI](range_error(const string&): Remove.             [_GLIBCXX_USE_CXX11_ABI](overflow_error(const string&): Remove.             [_GLIBCXX_USE_CXX11_ABI](underflow_error(const string&): Remove. Ok to commit ? François On 11/08/2023 09:51, Jonathan Wakely wrote: > > > On Fri, 11 Aug 2023, 06:44 François Dumont via Libstdc++, > > wrote: > > I hadn't tested the most basic default configuration and it is > failing, > > > I did wonder about that when you said which configurations you had > tested :) > > > > > I need some more time yet. > > > OK, no problem. > > I actually have an idea for replacing the __cow_string hack with > something better, which I will try to work on next week. That might > make things simpler for you, as you won't need the __std_cow_string macro. > > > > > > François > > > On 10/08/2023 07:13, François Dumont wrote: > > Hi > > > > I've eventually completed this work. > > > > This evolution will allow to build libstdc++ without dual abi and > > using cxx11 abi. For the moment such a config is only accessible > > through the --enable-symvers=gnu-versioned-namespace configuration. > > > >     libstdc++: [_GLIBCXX_INLINE_VERSION] Use cxx11 abi [PR83077] > > > >     Use cxx11 abi when activating versioned namespace mode. > > > >     libstdcxx-v3/ChangeLog: > > > >             PR libstdc++/83077 > >             * acinclude.m4 [GLIBCXX_ENABLE_LIBSTDCXX_DUAL_ABI]: > > Default to "new" libstdcxx abi. > >             * config/locale/dragonfly/monetary_members.cc > > [!_GLIBCXX_USE_DUAL_ABI]: Define money_base > >             members. > >             * config/locale/generic/monetary_members.cc > > [!_GLIBCXX_USE_DUAL_ABI]: Likewise. > >             * config/locale/gnu/monetary_members.cc > > [!_GLIBCXX_USE_DUAL_ABI]: Likewise. > >             * config/locale/gnu/numeric_members.cc > > [!_GLIBCXX_USE_DUAL_ABI](__narrow_multibyte_chars): Define. > >             * configure: Regenerate. > >             * include/bits/c++config > > [_GLIBCXX_INLINE_VERSION](_GLIBCXX_NAMESPACE_CXX11, > > _GLIBCXX_BEGIN_NAMESPACE_CXX11): > >             Define empty. > > [_GLIBCXX_INLINE_VERSION](_GLIBCXX_END_NAMESPACE_CXX11, > > _GLIBCXX_DEFAULT_ABI_TAG): > >             Likewise. > >             * include/bits/cow_string.h [!_GLIBCXX_USE_CXX11_ABI]: > > Define a light version of COW > >             basic_string as __std_cow_string for use in stdexcept. > >             * include/std/stdexcept [_GLIBCXX_USE_CXX11_ABI]: > Define > > __cow_string. > >             (__cow_string(const char*)): New. > >             (__cow_string::c_str()): New. > >             * python/libstdcxx/v6/printers.py > > (StdStringPrinter::__init__): Set self.new_string to True > >             when std::__8::basic_string type is found. > >             * src/Makefile.am > > [ENABLE_SYMVERS_GNU_NAMESPACE](ldbl_alt128_compat_sources): > Define empty. > >             * src/Makefile.in: Regenerate. > >             * src/c++11/Makefile.am (cxx11_abi_sources): Rename > into... > >             (dual_abi_sources): ...this. Also move > cow-local_init.cc, > > cxx11-hash_tr1.cc, > >             cxx11-ios_failure.cc entries to... > >             (sources): ...this. > >             (extra_string_inst_sources): Move cow-fstream-inst.cc, > > cow-sstream-inst.cc, cow-string-inst.cc, > >             cow-string-io-inst.cc, cow-wtring-inst.cc, > > cow-wstring-io-inst.cc, cxx11-locale-inst.cc, > >             cxx11-wlocale-inst.cc entries to... > >             (inst_sources): ...this. > >             * src/c++11/Makefile.in: Regenerate. > >             * src/c++11/cow-fstream-inst.cc > [_GLIBCXX_USE_CXX11_ABI]: > > Skip definitions. > >             * src/c++11/cow-locale_init.cc > [_GLIBCXX_USE_CXX11_ABI]: > > Skip definitions. > >             * src/c++11/cow-sstream-inst.cc > [_GLIBCXX_USE_CXX11_ABI]: > > Skip definitions. > >             * src/c++11/cow-stdexcept.cc [_GLIBCXX_USE_CXX11_ABI]: > > Include . > >             [_GLIBCXX_USE_DUAL_ABI || > > _GLIBCXX_USE_CXX11_ABI](__cow_string): Redefine before including > >             . Define > > _GLIBCXX_DEFINE_STDEXCEPT_INSTANTIATIONS so that __cow_string > definition > >             in is skipped. > >             [_GLIBCXX_USE_CXX11_ABI]: Skip Transaction Memory TS > > definitions. > >             * src/c++11/cow-string-inst.cc > [_GLIBCXX_USE_CXX11_ABI]: > > Skip definitions. > >             * src/c++11/cow-string-io-inst.cc > > [_GLIBCXX_USE_CXX11_ABI]: Skip definitions. > >             * src/c++11/cow-wstring-inst.cc > [_GLIBCXX_USE_CXX11_ABI]: > > Skip definitions. > >             * src/c++11/cow-wstring-io-inst.cc > > [_GLIBCXX_USE_CXX11_ABI]: Skip definitions. > >             * src/c++11/cxx11-hash_tr1.cc > [!_GLIBCXX_USE_CXX11_ABI]: > > Skip definitions. > >             * src/c++11/cxx11-ios_failure.cc > > [!_GLIBCXX_USE_CXX11_ABI]: Skip definitions. > >             [!_GLIBCXX_USE_DUAL_ABI] (__ios_failure): Remove. > >             * src/c++11/cxx11-locale-inst.cc: Cleanup, just include > > locale-inst.cc. > >             * src/c++11/cxx11-stdexcept.cc > [!_GLIBCXX_USE_CXX11_ABI]: > > Skip definitions. > >             * src/c++11/cxx11-wlocale-inst.cc > > [!_GLIBCXX_USE_CXX11_ABI]: Skip definitions. > >             * src/c++11/locale-inst-numeric.h > > [!_GLIBCXX_USE_DUAL_ABI](std::use_facet>, > > std::use_facet>): Instantiate. > > [!_GLIBCXX_USE_DUAL_ABI](std::has_facet>, > > std::has_facet>): Instantiate. > > [!_GLIBCXX_USE_DUAL_ABI](std::num_get > istreambuf_iterator>): Instantiate. > > [!_GLIBCXX_USE_DUAL_ABI](std::num_put > ostreambuf_iterator>): Instantiate. > >             * src/c++11/locale-inst.cc [!_GLIBCXX_USE_DUAL_ABI]: > Build > > only when configured > >             _GLIBCXX_USE_CXX11_ABI is equal to currently built abi. > > [!_GLIBCXX_USE_DUAL_ABI](__moneypunct_cache): > > Instantiate. > > [!_GLIBCXX_USE_DUAL_ABI](__moneypunct_cache): > > Instantiate. > > [!_GLIBCXX_USE_DUAL_ABI](__numpunct_cache): Instantiate. > > [!_GLIBCXX_USE_DUAL_ABI](__timepunct): Instantiate. > > [!_GLIBCXX_USE_DUAL_ABI](__timepunct_cache): Instantiate. > >             [!_GLIBCXX_USE_DUAL_ABI](time_put > ostreambuf_iterator>): Instantiate. > > [!_GLIBCXX_USE_DUAL_ABI](time_put_byname > ostreambuf_iterator>): Instantiate. > > [!_GLIBCXX_USE_DUAL_ABI](__ctype_abstract_base): Instantiate. > > [!_GLIBCXX_USE_DUAL_ABI](ctype_byname): Instantiate. > > [!_GLIBCXX_USE_DUAL_ABI](__codecvt_abstract_base > mbstate_t>): Instantiate. > > [!_GLIBCXX_USE_DUAL_ABI](codecvt_byname > mbstate_t>): Instantiate. > > [!_GLIBCXX_USE_DUAL_ABI](codecvt_byname > mbstate_t>): Instantiate. > > [!_GLIBCXX_USE_DUAL_ABI](use_facet>(const locale&)): > > Instantiate. > > [!_GLIBCXX_USE_DUAL_ABI](use_facet > mbstate_t>>(const locale&)): Instantiate. > > [!_GLIBCXX_USE_DUAL_ABI](use_facet<__timepunct>(const locale&)): > > Instantiate. > > [!_GLIBCXX_USE_DUAL_ABI](use_facet>(const locale&)): > > Instantiate. > > [!_GLIBCXX_USE_DUAL_ABI](has_facet>(const locale&)): > > Instantiate. > > [!_GLIBCXX_USE_DUAL_ABI](has_facet > mbstate_t>>(const locale&)): Instantiate. > > [!_GLIBCXX_USE_DUAL_ABI](has_facet<__timepunct>(const locale&)): > > Instantiate. > > [!_GLIBCXX_USE_DUAL_ABI](has_facet>(const locale&)): > > Instantiate. > > [!_GLIBCXX_USE_DUAL_ABI](__add_grouping): Define. > >             [!_GLIBCXX_USE_DUAL_ABI](__pad>): > > Instantiate. > > [!_GLIBCXX_USE_DUAL_ABI](__int_to_char(C*, unsigned long, > > const C*, > >             ios_base::fmtflags, bool)): Define. > > [!_GLIBCXX_USE_DUAL_ABI](__int_to_char(C*, unsigned long > > long, const C*, > >             ios_base::fmtflags, bool)): Define. > >             * src/c++11/string-inst.cc > > (_GLIBCXX_DEFINING_CXX11_ABI_INSTANTIATIONS): Define following > >             _GLIBCXX_USE_CXX11_ABI value. > >             [_GLIBCXX_USE_CXX11_ABI && > > !_GLIBCXX_DEFINING_CXX11_ABI_INSTANTIATIONS]: > >             Define _GLIBCXX_DEFINING_COW_STRING_INSTANTIATIONS. > > Include . > >             Define basic_string as __std_cow_string for the current > > translation unit. > >             * src/c++11/wlocale-inst.cc [!_GLIBCXX_USE_CXX11_ABI]: > > Skip definitions. > >             * src/c++98/Makefile.am (cxx11_abi_sources): Remove, > > unique cow-istream-string.cc entry > >             move to... > >             (inst_sources): ...this. > >             * src/c++98/Makefile.in: Regenerate. > >             * src/c++98/cow-istream-string.cc: Include > > . > >             [_GLIBCXX_USE_CXX11_ABI]: Skip definitions. > >             * src/c++98/hash_tr1.cc [_GLIBCXX_USE_CXX11_ABI]: Skip > > definitions. > >             * src/c++98/ios_failure.cc > > [_GLIBCXX_USE_CXX11_ABI][_GLIBCXX_USE_DUAL_ABI]: Skip definitions. > >             * src/c++98/istream-string.cc [!_GLIBCXX_USE_DUAL_ABI]: > > Build only when configured > >             _GLIBCXX_USE_CXX11_ABI is equal to currently built abi. > >             * src/c++98/locale_facets.cc > > [_GLIBCXX_USE_CXX11_ABI](__verify_grouping): Remove. > >             * src/c++98/stdexcept.cc > > [_GLIBCXX_USE_CXX11_ABI](logic_error(const string&): Remove. > > [_GLIBCXX_USE_CXX11_ABI](domain_error(const string&): Remove. > > [_GLIBCXX_USE_CXX11_ABI](invalid_argument(const string&): > > Remove. > > [_GLIBCXX_USE_CXX11_ABI](length_error(const string&): Remove. > > [_GLIBCXX_USE_CXX11_ABI](out_of_range(const string&): Remove. > > [_GLIBCXX_USE_CXX11_ABI](runtime_error(const string&): > > Remove. > > [_GLIBCXX_USE_CXX11_ABI](range_error(const string&): Remove. > > [_GLIBCXX_USE_CXX11_ABI](overflow_error(const string&): > > Remove. > > [_GLIBCXX_USE_CXX11_ABI](underflow_error(const string&): > > Remove. > > > > Tested under linux x86_64 with following configs: > > > > --enable-symvers=gnu-versioned-namespace > > > > --disable-libstdcxx-dual-abi > > > > Ok to commit ? > > > > François > > > > >