我有一个项目,在 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_info
部分。回到项目设置并仅从-flto
CFLAGS 中删除即可解决问题。objdump -g
在没有 LTO 的 ELF 文件上现在显示一个.debug_info
部分,其中填充了对我项目中函数的正确引用,并且调试再次正常工作。
如何让 LTO 和调试符号一起玩得很好?
编辑:忘记包含我的 gcc 信息。我使用的是GNU ARM Embedded Toolchain,测试是在 5.4-2016q2 和 5.4-2016q3 版本上进行的。