ARM Cortex-M4 プロセッサで実行されているプロジェクトがあり、gcc リンク時最適化 (LTO) 機能を含めようとしています。
現在、私のコンパイルとリンクのフラグは次のとおりです。
CFLAGS = -ggdb -ffunction-sections -Og
LDFLAGS = -Wl,-gc-sections
これらのフラグを使用するとすべてが正常に機能し、プロジェクトを正しくデバッグできます。
-flto
次に、CFLAGSに追加してみました。プログラムは正常に動作しますが、プロジェクトをデバッグすることができなくなり、gdb がデバッグ シンボルが見つからないという不平を言います。ELF ファイルを (LTO を有効にして)実行objdump -g
すると、次の出力が得られます。
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 で実行されました。