2

コンパイル中に次のエラーが発生しました

(.sram.text+0x1283): 危険な再配置: ウィンドウ化されたロングコールが 1GB の境界を超えます。return が失敗する可能性があります: ( UND +0xdeadcafe)

関数の 1 つに。

アーキテクチャは Xtensa で、使用されるツールチェーンは Xtensa 用に構築された GNU ツールチェーンです。このエラーは、binutils ソース コードのファイル elf32-xtensa.c の関数 elf_xtensa_do_reloc() 内にあります。

このエラーの原因と考えられる解決策を教えてください。

4

1 に答える 1

0

これは、デフォルトの Xtensa windowed-register ABI の既知の警告です。Xtensa ISAリファレンスマニュアルを引用:

リターン アドレス レジスタで格納されるウィンドウの増分a4 は、レジスタの最上位 2 ビットを占有するため、これらのビットはサブルーチン リターンによって埋められる必要があります。RETWおよび 命令はRETW.N、自身のアドレスの最上位 2 ビットからこれらのビットを埋めます。これにより、アドレス空間の別の 1GB 領域でルーチンを呼び出すためにレジスタ ウィンドウ呼び出しが使用されるのを防ぎます。

これを修正するには、次の 2 つのオプションがあります。

  1. コードのロード ベース アドレスを調整したり、コードが 1 GB の領域に収まるまで小さく (!) して修正したりできます。
  2. それが機能しない場合、またはオプションではない場合は、Xtensa システムで実行されているすべてのものを、代替の CALL0 ABI をサポートするコンパイラで再コンパイルする必要があります。これは、レジスタ ファイルを「フラット」として扱い、問題のあるウィンドウ化を回避します。コールとリターンの指示。
于 2015-11-19T17:36:06.703 に答える