We recently caught a report because of [GCC 5.1, libstdc++ and Dual ABI](http://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html). It seems [Clang is not aware of the GCC inline namespace changes](http://llvm.org/bugs/show_bug.cgi?id=23529), so it generates code based on one set of namespaces or symbols, while GCC used another set of namespaces or symbols. At link time, there are problems due to missing symbols.

If I am parsing the [Dual ABI](http://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html) page correctly, it looks like a matter of pivoting on `_GLIBCXX_USE_CXX11_ABI` and `abi::cxx11` with some additional hardships. More reading is available on Red Hat's blog at [GCC5 and the C++11 ABI](http://developerblog.redhat.com/2015/02/05/gcc5-and-the-c11-abi/) and [The Case of GCC-5.1 and the Two C++ ABIs](http://allanmcrae.com/2015/06/the-case-of-gcc-5-1-and-the-two-c-abis/).

Below is from a Ubuntu 15 machine. The machine provides GCC 5.2.1.

```
$ cat test.cxx
#include <string>

std::string foo __attribute__ ((visibility ("default")));
std::string bar __attribute__ ((visibility ("default")));

$ g++ -g3 -O2 -shared test.cxx -o test.so

$ nm test.so | grep _Z3
...
0000201c B _Z3barB5cxx11
00002034 B _Z3fooB5cxx11

$ echo _Z3fooB5cxx11 _Z3barB5cxx11 | c++filt 
foo[abi:cxx11] bar[abi:cxx11]

```

How can I generate a binary with symbols using both decorations ("coexistence" as the Red Hat blog calls it)?

Or, what are the options available to us?

---

I'm trying to achieve an "it just works" for users. I don't care if there are two weak symbols with two different behaviors (`std::string` lacks copy-on-write, while `std::string[abi:cxx11]` provides copy-on-write). Or, one can be an alias for the other.

Debian has a boatload of similar bugs at [Debian Bug report logs: Bugs tagged libstdc++-cxx11](http://bugs.debian.org/cgi-bin/pkgreport.cgi?tag=libstdc%2B%2B-cxx11;users=debian-gcc@lists.debian.org). Their solution was to rebuild everything under the new ABI, but it did not handle the corner case of mixing/matching compilers modulo the ABI changes.

In the Apple world, I think this is close to a fat binary. But I'm not sure what to do in the Linux/GCC world. Finally, we don't control how the distro's build the library, and we don't control what compilers are used to link an applications with the library.