Debugging gcc LTO显示为去除调试符号

Debugging gcc LTO显示为去除调试符号,debugging,gcc,optimization,lto,Debugging,Gcc,Optimization,Lto,我有一个在ARM Cortex-M4处理器上运行的项目,我试图在其中包括gcc链路时间优化(LTO)功能 当前我的编译和链接标志为: CFLAGS = -ggdb -ffunction-sections -Og LDFLAGS = -Wl,-gc-sections 使用这些标志一切正常,我能够正确地调试项目 然后我尝试将-flto添加到CFLAGS。虽然程序运行良好,但我无法再调试该项目,gdb抱怨缺少调试符号。在ELF文件上运行objdump-g(启用LTO)将提供以下输出: xxx.elf

我有一个在ARM Cortex-M4处理器上运行的项目,我试图在其中包括gcc链路时间优化(LTO)功能

当前我的编译和链接标志为:

CFLAGS = -ggdb -ffunction-sections -Og
LDFLAGS = -Wl,-gc-sections
使用这些标志一切正常,我能够正确地调试项目

然后我尝试将
-flto
添加到CFLAGS。虽然程序运行良好,但我无法再调试该项目,gdb抱怨缺少调试符号。在ELF文件上运行
objdump-g
(启用LTO)将提供以下输出:

xxx.elf:     file format elf32-littlearm

Contents of the .debug_frame section:

00000000 0000000c ffffffff CIE
  Version:               1
  Augmentation:          ""
  Code alignment factor: 2
  Data alignment factor: -4
  Return address column: 14

  DW_CFA_def_cfa: r13 ofs 0

00000010 00000018 00000000 FDE cie=00000000 pc=08002a3c..08002a88
  DW_CFA_advance_loc: 2 to 08002a3e
  DW_CFA_def_cfa_offset: 16
  DW_CFA_offset: r4 at cfa-16
  DW_CFA_offset: r5 at cfa-12
  DW_CFA_offset: r6 at cfa-8
  DW_CFA_offset: r14 at cfa-4
  DW_CFA_nop

0000002c 0000000c ffffffff CIE
  Version:               1
  Augmentation:          ""
  Code alignment factor: 2
  Data alignment factor: -4
  Return address column: 14

  DW_CFA_def_cfa: r13 ofs 0

0000003c 0000000c 0000002c FDE cie=0000002c pc=08002a88..08002a98
请注意缺少的
.debug\u info
部分。返回项目设置,仅从CFLAGS中删除
-flto
,即可解决此问题<在没有LTO的ELF文件上,code>objdump-g现在显示一个
.debug\u info
部分,其中填充了对项目中函数的正确引用,调试工作再次正常

如何使LTO和调试符号配合良好


编辑:忘记包含我的gcc信息。我正在使用,测试是在版本5.4-2016q2和5.4-2016q3上执行的。

这是因为gcc不支持将
-flto
-g
组合

你可以找到细节

“将
-flto
-g
相结合目前是实验性的,预计会 产生意想不到的结果。”


当您使用
-flto
时,
-g
将被忽略。

可以尝试使用属性((已使用)),或者可以尝试以不改变其值的方式使用调试符号。

现在情况应该已经有所改善。 GCC 8最终获得了早期调试信息的改进:

虽然可以使用LTO和-g构建并调试生成的 二进制,调试信息有点混乱,而不是C 与语言程序对应的调试信息最初是 写在。这个问题终于解决了。[…]主要思想是生产 在编译的早期,将其存储到对象文件中,并在 链接时间只需将必要的片段复制到最终的对象文件,而无需 需要编译器对其进行解析和更新


但是请注意,
-gsplit-dwarf
不会与LTO一起工作。

这里有一些信息可能会让您感兴趣:您是否已经弄清楚了?还没有。不过,我还没有在更新版本的gcc上进行测试。@TrygveLaugstøl Update:我刚刚在最新版本的GNU ARM嵌入式工具链(6-2017-q1-Update)上进行了测试,至少根据objdump,调试符号又回来了。不幸的是,由于是周末,我无法访问我的硬件来测试它。我会在我回来后报告的。@swineone很好,谢谢你让我知道!目前7.3.0的内容是“链接时间优化在生成调试信息时效果不佳。将-flto与-g相结合目前是实验性的,预计会产生意想不到的结果。”我决定接受这个答案,尽管我没有用较新版本的gcc进行过实际的尝试。如果有人尝试,但仍然有问题,请在下面留下评论。