1

すべての関数を独自のセクションに移動するために、gcc フラグ -ffunction-sections を使用して C ファイルをコンパイルしています。アセンブラはエラーをスローしています:

job_queue.s:2395: Error: operation combines symbols in different segments

行 2395 でのコンパイラのアセンブリ出力は次のとおりです。

.section    .debug_ranges,info
.Ldebug_ranges0:
.4byte  .LBB7-.Ltext0

シンボル LBB7 は、「.text.add_event_handler」という名前の関数 (したがってセクション) にあります。シンボル Ltext0 は、「.text」という名前の (それ以外の場合は空の) セクションにあります。

GCC --version は以下を提供します:

pic30-elf-gcc.exe (GCC) 4.0.3 (dsPIC30, Microchip v3_30) (B) Build date: Jun 29 2011

コンパイラ フラグ -g0 (デバッグ情報を無効にする) を使用すると、すべてが完全にコンパイルおよび実行されます。

私の質問: この GCC 出力は明らかに間違っていますか? GCC は、シンボル LBB7 のオフセットを .text セクションではなく .add_even_handler セクションの先頭から計算する必要があったようです。

Google で同じ問題を抱えている人が見つからないので、何か誤解していると思います。

4

1 に答える 1

1

GCC の出力は間違いなく間違っています。おそらく、新しい GCC バージョンでは修正されているでしょう。コンパイラをアップグレードできない場合は、 でコンパイルする-gdwarf-2か、失敗した場合は でコンパイルしてみ-gdwarf-2 -gstrict-dwarfてください (-gstrict-dwarfコンパイラもアップグレードする必要があるため)。

このオプションが行うことは、DWARF3 で導入された不連続アドレス範囲のサポートを含まない (厳密な) DWARF2 を生成するように GCC に指示することです。

もちろん、これによりデバッグ情報の品質が多少低下する可能性があります、YMMV。

于 2012-11-20T07:53:11.473 に答える