カスタマーサポートセンター

FAQ~よくある質問~ | FAQマスタ詳細表示

FAQ詳細情報

ID 10810897
FAQカテゴリ(大) リンカ
最終更新日 2015-12-26

質問内容

TN51348: リンカーは、関数と変数または見つからない external を削除します。

回答内容

ターゲット:  全て 
コンポーネント  リンカ 
公開  2011/11/07 10:48 

 

概要
リンカは、main() または割り込みからのコールツリーから参照されない関数と変数を、デフォルトで、削除します。__root 拡張キーワードを使用すると、これを抑止し、特定の変数や関数をリンカに残すよう強制できます。

__root char myvariable;
__root void myfunction(void)
{
    /* function code */
}

 

参照されない関数/変数を削除しないようにする、他の方法は、

* IAR XLINK Linker の -g オプション
* IAR ILINK Linker の --keep オプション
* アセンブラの REQUIRE キーワードを使用する。
です。

 

このふるまいには利点があります。
* RAM / ROM を節約します。
* "segment did not fit" エラーを減らすことができます。
* 使用しない "external" 変数/関数が検索されないので、エラーが少なくすることにつながります。

コンパイラは、使わない絶対アドレスの変数を削除します。
これは、他のモジュールがそれらを参照していると、問題になります。

それは以下のようなコードの場合です。

このコンパイル単位では、変数 test1 のみ保持されています。test2、test3、test4 は、アクセスされているので保持されていません。 もし、他の C ファイルが test2 を使用していても、リンカは見つけることができません。

__no_init int test1 @ 0x0004;
__no_init int test2 @ 0x0008;
__no_init int test3 @ 0x000C;
__no_init int test4 @ 0x0010;

void abc(void)
{
    test1 = 1;
}

参照されない変数や関数を削除する重要な理由の1つは、デバイス特定 の .h ファイルが、もし複数インクルードされると、セグメントの重複エラーを起こし得る非常に多くの変数を生成するからです。

 

全ての製品の名前は、それぞれの所有者の商標または登録商標です。

参考資料URL