- IAR Embedded Workbench for Arm 9.70.x
- IAR C/C++ 開発
- アプリケーションのリンク
- トラブルシューティングについてのヒント
トラブルシューティングについてのヒント
ILINKは、以下のような、コードおよびデータの配置を正しく管理するために役に立ついくつかの機能を提供しています。
再配置エラー
命令を正しく再配置できない場合、ILINKにより、再配置エラーが発生します。このエラーは、ターゲットが範囲外にある命令または型が一致しない命令などで発生します。
ILINKで発生する再配置エラーの例を以下に示します。
Error[Lp002]: relocation failed: out of range or illegal value
Kind : R_XXX_YYY[0x1]
Location : 0x40000448
"myfunc" + 0x2c
Module: somecode.o
Section: 7 (.text)
Offset: 0x2c
Destination: 0x9000000c
"read"
Module: read.o(iolib.a)
Section: 6 (.text)
Offset: 0x0このメッセージエントリについて、以下の表で説明します。
メッセージエントリ | 説明 |
|---|---|
| 失敗した再配置ディレクティブ。ディレクティブは、使用される命令により異なります。 |
| 問題が発生した場所。詳細については、以下を参照してください。 • 16 進数およびオフセットを持つラベルとして表される命令アドレス。この例の場合、 • モジュールおよびファイル。この例の場合、モジュールは • セクション番号およびセクション名。この例では、セクション番号は • バイト数で指定されるセクション内のオフセット。この例では |
| 命令のターゲット。詳細については、以下を参照してください。 • 16 進数およびオフセットを持つラベルとして表される命令アドレス。この例では、 • モジュール、およびライブラリ(該当する場合)。この例の場合、モジュールは • セクション番号およびセクション名。この例の場合、セクション番号は • バイト数で指定されるセクション内のオフセット。この例のオフセットを以下に示します。 |
考えられる解決方法
このケースでは、myfuncから__readにある命令までの長さが、分岐命令の飛び先の範囲を超えています。
考えられる解決方法としては、2つの.textセクションをそれぞれの近くに配置するか、必要な距離に到達できる他の呼び出し方法を使用します。また、参照元の関数が不正な飛び先を参照したために範囲エラーが発生した可能性もあります。
範囲エラーに対しては、その内容に応じた解決方法があります。通常は、上記の方法をベースに多少変更を加えた方法、すなわち、コードやセクション配置を変更することによって解決できます。