以下代码在gcc-4.9,5.4和6.3下使用std = c ++ 11进行段错误,但在clang-3.7和VS2015 Update 3下编译并运行正常.
struct A
{
int Func() { return x++; }
int x = 5;
};
struct B
{
B(int) {}
};
struct Derived : public virtual A, public B
{
Derived()
: A()
// , B(this->Func()) // This works!
, B([this](){ return this->Func(); }()) // But this segfaults.
{
}
};
int main()
{
Derived c;
}
Run Code Online (Sandbox Code Playgroud)
这是gcc中的错误吗?删除虚拟继承可修复segfault.
我正在讨论如何调试一个我无法简化为最小例子的重大问题.
问题:我编译了链接到许多不同库的应用程序.标志包括:
-static-libstdc++ -static-libgcc -pipe -std=c++1z -fno-PIC -flto=10 -m64 -O3 -flto=10 -fuse-linker-plugin -fuse-ld=gold -UNDEBUG -lrt -ldl
编译器是gcc-7.3.0,针对binutils-2.30编译.Boost编译时使用与程序其余部分相同的标志,并静态链接.
当程序被链接时,我得到关于重定位的各种警告,指的是丢弃的部分,在我自己的代码和boost中.例如:
/tmp/ccq2Ddku.ltrans13.ltrans.o:<artificial>:function boost::system::(anonymous namespace)::generic_error_category::message(int) const: warning: relocation refers to discarded section
Run Code Online (Sandbox Code Playgroud)
然后,当我运行该程序时,它会使用回溯进行破坏:
Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) bt
#0 0x0000000000000000 in ?? ()
#1 0x00007ffff7345a49 in __run_exit_handlers () from /lib64/libc.so.6
#2 0x00007ffff7345a95 in exit () from /lib64/libc.so.6
#3 0x00007ffff732eb3c in __libc_start_main () from /lib64/libc.so.6
#4 0x000000000049b3e3 in _start ()
Run Code Online (Sandbox Code Playgroud)
尝试调用的函数指针是0x0.
如果我使用static-libstdc ++删除,链接器警告和运行时段错误就会消失.
如果我从c ++ 1z更改为c ++ 14,链接器警告和运行时段错误就会消失. …