This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: C++98/C++11 ABI compatibility for gcc-4.7
- From: "James Y Knight" <foom at fuhm dot net>
- To: jyasskin at googlers dot com, gcc at gcc dot gnu dot org
- Date: Thu, 31 May 2012 17:35:18 -0400
- Subject: Re: C++98/C++11 ABI compatibility for gcc-4.7
You've missed at least one ABI incompatibility in GCC 4.7 and later, as
demonstrated in real life by (at least) libboost_python, and distilled
into this test case.
At least these bug reports are probably caused by this ABI incompatibility:
https://svn.boost.org/trac/boost/ticket/6919
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53455
https://svn.boost.org/trac/boost/ticket/6895
As I've said before, I really wish GCC devs would take the ABI
incompatibility problem more seriously. Lots of users have already started
using -std=c++0x mode, and have absolutely no idea that it's completely
unsafe to do so on a normal linux distro, linking against regular C++
libraries that are not compiled with a) c++11 enabled, and b) the exact
same version of GCC.
I understand that the ABI changes generally cannot be avoided, but a lot
of pain for a lot of people could be avoided by making things fail
obviously with a link error, instead of sometimes, arbitrarily, if you're
lucky, you'll get a segfault at runtime.
====test1.cpp====
#include <utility>
std::pair<int, int> execute()
{
return std::make_pair(0, 1);
}
====test2.cpp====
#include <utility>
#include <stdio.h>
std::pair<int, int> execute();
int main() {
std::pair<int, int> result = execute();
printf("%d %d\n", result.first, result.second);
}
====test.sh====
#!/bin/sh
CC="g++-4.7 -O1"
$CC -std=c++03 -o test_cxx03.o -c test.cpp
$CC -std=c++0x -o test_cxx11.o -c test.cpp
$CC -std=c++03 -o test2_cxx03.o -c test2.cpp
$CC -std=c++0x -o test2_cxx11.o -c test2.cpp
$CC -o test test_cxx03.o test2_cxx03.o; ./test
$CC -o test test_cxx11.o test2_cxx11.o; ./test
$CC -o test test_cxx03.o test2_cxx11.o; ./test
$CC -o test test_cxx11.o test2_cxx03.o; ./test
====output====
0 1
0 1
-1757034448 32767
Segmentation fault