4
我有以下情況(Ubuntu 15.10和Debian測試)gcc5.2 abi變更 - >兼容性保證?
我有Lib A編譯沒有cxx11和lib B使用-std = C++ 11。 B包括和連接對A,A使用提升。
如果我將B鏈接到A,則在dynload期間創建的應用程序a會崩潰。 如果我編譯A沒有cxx11或B與cxx11一切正常。
我的問題:據我瞭解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>, [email protected]=1,
[email protected]=0x7fffffffe688, [email protected]=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的:
[email protected]:/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
你用'g ++ -Wall -Wextra -g'編譯了嗎?您是否使用[valgrind](http://valgrind.org/),'gdb'和[地址清理程序](http://en.wikipedia.org/wiki/AddressSanitizer)來了解您的錯誤? plase在你的問題中顯示一些示例代碼([MVCE](http://stackoverflow.com/help/mcve)...)所以請**編輯你的問題**以改善它 –
其實至少'std ABI級別的:: string'不同於'-std = C++ 11'和'-std = c = + 03',所以混合使用不同的標準會造成隨機崩潰。加上c + + 11沒有立即實現,所以一些舊的gcc'std :: string'不是馬克C++ 11的要求,所以你看不到任何崩潰。 – fghj
@ user1034749據我瞭解應該新的ABI導致unlinkebale代碼。這是我的問題,爲什麼這不會發生在這裏:http://developerblog.redhat.com/2015/02/05/gcc5-and-the-c11-abi/ –