小编And*_*rew的帖子

带有虚拟继承的初始化列表中的lambda捕获的gcc bug?

以下代码在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.

c++ lambda gcc

10
推荐指数
1
解决办法
303
查看次数

c ++ 17,lto,-static-libstdc ++问题:警告:重定位是指带有ld.gold的丢弃部分,然后是__run_exit_handlers中的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,链接器警告和运行时段错误就会消失. …

c++ linker-errors gold-linker c++17

1
推荐指数
1
解决办法
1166
查看次数

标签 统计

c++ ×2

c++17 ×1

gcc ×1

gold-linker ×1

lambda ×1

linker-errors ×1