2016-11-22 180 views
4

我有项目,上了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上执行了测试。

+0

有一些信息可能会感兴趣的你在这里:https://gcc.gnu.org/wiki/early-debug – Pyves

+0

你有没有想出解决办法? –

+0

还没有。我还没有在新版本的gcc上进行过测试。 – swineone

回答

1

这是因为gcc不支持合并-flto与-g。

你可以找到详细here

“结合-flto与-g目前处于试验阶段,预计 产生意想不到的效果。”

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