2016-11-22 47 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將被忽略。