我有项目,上了ARM Cortex-M4处理器,在这里我想包括GCC链接时优化(LTO)功能运行。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
部分。回到项目设置,只从CFLAGS中删除-flto
解决了这个问题。没有LTO的ELF文件上的objdump -g
现在显示.debug_info
部分,其中填充了对我的项目中的函数的适当引用,并且调试再次正常工作。
如何获得LTO和调试符号发挥得很好?
编辑:忘了,包括我的gcc信息。我正在使用GNU ARM Embedded Toolchain,并且在版本5.4-2016q2和5.4-2016q3上执行了测试。
有一些信息可能会感兴趣的你在这里:https://gcc.gnu.org/wiki/early-debug – Pyves
你有没有想出解决办法? –
还没有。我还没有在新版本的gcc上进行过测试。 – swineone