我有項目,上了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