Hi Daniel,
Here's what I understand about this topic.
devtoolset-6 defaults to the old c++ ABI. Normally, users on gcc6 would be required to opt-in to the older ABI when using c++14, but devtoolset-6 was compiled like this:
$ g++ -v
...
Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,fortran,lto --prefix=/opt/rh/devtoolset-6/root/usr --mandir=/opt/rh/devtoolset-6/root/usr/share/man --infodir=/opt/rh/devtoolset-6/root/usr/share/info --with-bugurl=
http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --enable-plugin --with-linker-hash-style=gnu --enable-initfini-array --disable-libgcj --with-default-libstdcxx-abi=gcc4-compatible --with-isl=/builddir/build/BUILD/gcc-6.3.1-20170216/obj-x86_64-redhat-linux/isl-install --enable-libmpx --enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
...
gcc version 6.3.1 20170216 (Red Hat 6.3.1-3) (GCC)
This is the key part: --with-default-libstdcxx-abi=gcc4-compatible
This doc is relevant:
Particularly, this section:
"""
The
_GLIBCXX_USE_CXX11_ABI macro (see
Macros) controls whether
the declarations in the library headers use the old or new ABI.
So the decision of which ABI to use can be made separately for each
source file being compiled.
Using the default configuration options for GCC the default value
of the macro is
1 which causes the new ABI to be active,
so to use the old ABI you must explicitly define the macro to
0 before including any library headers.
(Be aware that some GNU/Linux distributions configure GCC 5 differently so
that the default value of the macro is
0 and users must
define it to
1 to enable the new ABI.)
"""
Note that it says, "Be aware that some GNU/Linux distributions configure GCC 5 differently so that the default value of the macro is 0."
That note is referring to the --with-default-libstdcxx-abi=gcc4-compatible flag above.
The end result is that DTS gcc6 defaults to the old ABI to allow c++11 interop with the older system compiler (gcc4).
My reading of the DTS docs suggests that this DTS flag is no longer relevant in the newer devtoolset versions -- the compiler is now being built in its default new ABI mode. That's why their docs mention: "objects compiled with the system GCC in C++11 or C++14 mode are not compatible."
This effectively means that projects that explicitly #define _GLIBCXX_USE_CXX11_ABI in their implementations will need to allow for this flag to be controlled externally if they want to keep source compatibility with the old world. Because DTS/gcc6 used the old ABI as the default, it's not surprising to find projects that do not account for this difference and use whatever is the compiler's default. Those are straightforward to deal with -- they will have to be recompiled.
IIUC this means that we can't use any c++11/14 objects compiled with DTS/gcc6 (using the old ABI) with the newer DTS compilers in their default modes without explicitly #defining the old ABI. Stuff will need to be recompiled.