gcc5.2 abi更改 - >兼容性保证?

时间:2015-11-02 10:04:36

标签: c++ c++11 gcc boost abi

我有以下情况(Ubuntu 15.10和Debian Testing)

我有一个没有cxx11编译的Lib A和一个使用-std = c ++ 11的lib B. B包括和A的链接,A使用boost。

如果我将B链接到A,则A创建的应用程序在dynload期间崩溃。 如果我使用cxx11编译没有cxx11或B的A,一切正常。

我的问题:据我所知,ABI名称空间添加应该保证这样的问题。我错了吗?

我创建了一个示例项目来澄清问题: https://github.com/goldhoorn/sandbox/tree/gcc5.2-issue test1失败,其他测试通过。

GDB告诉我:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7bceb2e in _GLOBAL__sub_I_Lib.cpp () from ./libmyLib.so
(gdb) bt
#0  0x00007ffff7bceb2e in _GLOBAL__sub_I_Lib.cpp () from ./libmyLib.so
#1  0x00007ffff7deaa0a in call_init (l=<optimized out>, argc=argc@entry=1, 
argv=argv@entry=0x7fffffffe688, env=env@entry=0x7fffffffe698)
at dl-init.c:78
#2  0x00007ffff7deaaf3 in call_init (env=0x7fffffffe698, argv=0x7fffffffe688, 
argc=1, l=<optimized out>) at dl-init.c:36
#3  _dl_init (main_map=0x7ffff7ffe1a8, argc=1, argv=0x7fffffffe688, 
env=0x7fffffffe698) at dl-init.c:126
#4  0x00007ffff7ddd1ca in _dl_start_user () from /lib64/ld-linux-x86-64.so.2
#5  0x0000000000000001 in ?? ()
#6  0x00007fffffffe89f in ?? ()
#7  0x0000000000000000 in ?? ()

Valgrind的结果:

goldhoorn@debian:/tmp/example$ LD_LIBRARY_PATH=. valgrind --show-below-main=yes ./main 
==17140== Memcheck, a memory error detector
==17140== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==17140== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==17140== Command: ./main
==17140== 
==17140== 
==17140== Process terminating with default action of signal 11 (SIGSEGV)
==17140==  Bad permissions for mapped region at address 0x401FE8
==17140==    at 0x4E3EB2E: _GLOBAL__sub_I_Lib.cpp (in /tmp/example/libmyLib.so)
==17140==    by 0x400EA09: call_init.part.0 (dl-init.c:78)
==17140==    by 0x400EAF2: call_init (dl-init.c:36)
==17140==    by 0x400EAF2: _dl_init (dl-init.c:126)
==17140==    by 0x40011C9: ??? (in /lib/x86_64-linux-gnu/ld-2.19.so)
==17140== 
==17140== HEAP SUMMARY:
==17140==     in use at exit: 72,704 bytes in 1 blocks
==17140==   total heap usage: 1 allocs, 0 frees, 72,704 bytes allocated
==17140== 
==17140== LEAK SUMMARY:
==17140==    definitely lost: 0 bytes in 0 blocks
==17140==    indirectly lost: 0 bytes in 0 blocks
==17140==      possibly lost: 0 bytes in 0 blocks
==17140==    still reachable: 72,704 bytes in 1 blocks
==17140==         suppressed: 0 bytes in 0 blocks
==17140== Rerun with --leak-check=full to see details of leaked memory
==17140== 
==17140== For counts of detected and suppressed errors, rerun with: -v
==17140== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Segmentation fault

1 个答案:

答案 0 :(得分:0)

请根据Cxx11 ABI向后不兼容列表检查您的图书馆A:https://gcc.gnu.org/wiki/Cxx11AbiCompatibility

  

C ++ 98语言与C ++ 11语言ABI兼容,但库中的几个地方破坏了兼容性。这使得将C ++ 98对象与C ++ 11对象链接起来很危险。

相关问题