https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html
I ran into crashing/valgrind issues with using std::string on GCC 5. The above link hints that there is a change in the ABI starting GCC 5.x. The new default ABI for libstd++ is C++11/14... which is not compatible with the older ABI. There is a way to select the older ABI using a define.
I am trying to understand what is the difference between the ABIs and haven't found details. I'd like help understanding:
- What kind of issues with std::string need to be fixed to be compatible with the new ABI? Are they copy-on-write related?
- Will those changes break it for older ABI?
- Any tips in getting _GLIBCXX_USE_CXX11_ABI to work?
More details on the issue I ran into (https://github.com/YasserAsmi/jvar/issues/21) The project worked fine in GCC 4.8 and Clang. With GCC, the same code refuses to run:
x_misc(33112,0x7fff728c2000) malloc: *** error for object 0x7fd639c034cc: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug Abort trap: 6
And here is a partial Valgrind output:
==33027== Invalid read of size 1 ==33027== at 0x1006F78BA: _platform_memmove$VARIANT$Nehalem (in /usr/lib/system/libsystem_platform.dylib) ==33027== by 0x100009388: jvar::Variant::toString[abi:cxx11]() const (in bin/ex_misc) ==33027== by 0x1000023A7: bugreport() (in bin/ex_misc) ==33027== by 0x1000133B8: main (in bin/ex_misc)
The project uses std::string and has some custom memory management. It is doing some non-typical but valid operations using placement new constructors etc. I am trying to understand better what kind of code is effected by the API and how to fix it--a place to start.