15

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セクションに注意してください。プロジェクト設定に戻り、-fltoCFLAGS から削除するだけで問題が解決します。objdump -gLTO なしの ELF ファイル.debug_infoでは、プロジェクト内の関数への適切な参照で満たされたセクションが表示され、デバッグが再び正常に機能します。

LTO とデバッグ シンボルを一緒にうまく再生するにはどうすればよいですか?

編集:私のgcc情報を含めるのを忘れていました。私はGNU ARM Embedded Toolchainを使用しており、テストはバージョン 5.4-2016q2 および 5.4-2016q3 で実行されました。

4

3 に答える 3

7

-fltoこれは、gcc が との結合をサポートしていないため-gです。

詳細については、 GCC Online Docs - Optimize Optionsを参照してください。

「との組み合わせは現在実験段階-flto-gあり、予期しない結果が生じることが予想されます。」

を使用する-fltoと、-gは無視されます。

于 2017-07-28T02:12:21.393 に答える
0

属性((used)) を使用してみるか、または値を変更しない方法でデバッグ シンボルを使用してみることができます。

于 2018-08-19T07:41:30.943 に答える