我正在就如何调试一个我无法简化为最小示例的重大问题提出一些建议。
问题:我编译了链接到许多不同库的应用程序。标志包括:
-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
然后当我运行程序时,它会在销毁时出现段错误,并带有回溯:
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 ()
试图调用的函数指针是 0x0。
如果我使用 static-libstdc++ 删除,链接器警告和运行时段错误就会消失。
如果我从 c++1z 更改为 c++14,链接器警告和运行时段错误就会消失。
如果我删除 -flto,链接器警告和运行时段错误就会消失。
如果我在编译标志中添加“-g”,链接器警告和运行时段错误就会消失。
我曾尝试通过指定 -Wl,--debug=all 来要求黄金进行额外的调试,但它似乎告诉我没有任何相关性。
如果我尝试使用一小部分看起来相关的代码,单独编译并将其链接到相同的 boost 库(即尝试生成最小示例),则没有链接器警告,并且程序运行完成没有问题.
帮助!我能做些什么来缩小问题的范围?