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

テクニカル・ノート 51348

アーキテクチャ:

All

コンポーネント:

linker

更新日:

2018/08/13 5:24

はじめに

関数や変数がmain()の呼び出しツリーから参照されていない場合、または、関数や変数がどの割り込みの呼び出しツリーからも参照されていない場合、デフォルトではそれらの関数や変数はリンカによって削除されます。

拡張キーワード__rootを使用すると、リンカによるこの動作を抑制でき、特定の変数や関数が削除されないようにできます。

__root char myvariable;

__root void myfunction(void)
{
/* function code */
}

以下の方法でも関数や変数を維持できます。

  • IAR XLINKリンカで-gオプションを使用する
  • IAR ILINKリンカで--keepオプションを使用する
  • アセンブラでREQUIREキーワードを使用する

リンカによるこの動作の利点

  • RAMやROMの使用量を減らすことができます。
  • "segment did not fit"エラーが発生する可能性を減らすことができます。
  • 使用されていない「外部の」変数や関数が検索されなくなり、エラーを減らすことができます。

コンパイラも、絶対アドレス上にある未使用の変数を削除します。
他のモジュールがそれらの変数を参照している場合、問題が発生する可能性があります。
そのような状況を以下のコードで説明します。
このコンパイル単位では、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;
}

リンカやコンパイラによって変数や関数が削除される大きな理由の一つとして、デバイス固有のspecific.hファイルによって非常に大量の変数が生成されることが挙げられます。このファイルが複数のモジュールでインクルードされると、セグメントオーバーラップエラーが発生する可能性があります。

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

申し訳ございませんが、弊社サイトではInternet Explorerをサポートしていません。サイトをより快適にご利用いただくために、Chrome、Edge、Firefoxなどの最新ブラウザをお使いいただきますようお願いいたします。