リンクプロセスの詳細
IARコンパイラおよびアセンブラにより生成されるオブジェクトファイルおよびライブラリの再配置可能モジュールは、そのまま実行することはできません。これらが実行可能なアプリケーションとなるには、リンクが必要です。
注記
別のベンダのツールセットで生成されたモジュールも同様にビルドに含めることができます。ただし、モジュールがAEABI (Arm Embedded Application Binary Interface)準拠の場合に限ります。ただし、AEABI準拠でない場合、同じベンダのコンパイラユーティリティライブラリが必要な点に注意してください。
リンカはリンクプロセスに使用されます。通常、以下の手順を実行します(一部の手順は、コマンドラインオプションやリンカ設定ファイルのディレクティブによって無効化できます)。
アプリケーションに含めるモジュールを判別します。オブジェクトファイルで提供されるモジュールは、常に含まれます。ライブラリファイルのモジュールは、インクルードされるモジュールから参照されるグローバルシンボルの定義を持つものだけが含まれます。
使用する標準ライブラリファイルを選択する。選択は、インクルードするモジュールの属性に基づいて行われます。これらのライブラリは、依然として解決されていないすべての未定義シンボルを充足するために使用されます。
複数の定義を持つシンボルを処理します。weakではない定義が複数あると、エラーが出力されます。それ以外の場合、いずれかひとつの定義が選択され(weakでない定義がある場合はそれが選択されます)、その他は無効化されます。weak定義は通常、インライン関数およびテンプレート関数に使用されます。ライブラリモジュールからのweakでない定義のいくつかをオーバライドする必要がある場合は、ライブラリモジュールがインクルードされていないことを確認してください(通常は、そのライブラリモジュールでアプリケーションが使用するすべてのシンボルについて、代替の定義を指定します)。
追加したモジュールのうちアプリケーションに含めるセクション/セクションフラグメントを判別します。アプリケーションで実際に必要なセクション/セクションフラグメントのみが含まれます。必要なセクション/セクションフラグメントを決定する方法は、いくつかあります。たとえば、
__rootオブジェクト属性、#pragma requiredディレクティブ、keepリンカディレクティブなどが使用できます。セクションが重複する場合は、1つのみ含まれます。必要に応じて、RAM内の初期化変数およびコードの初期化を実行します。
initializeディレクティブを使用すると、リンカによって追加のセクションが作成され、ROMからRAMへのコピーが可能になります。コピーによって初期化される各セクションは、2つのセクションに分割され、1つがROMパート、もう1つがRAMパートです。手動の初期化を使用しない場合、初期化を実行するための起動コードもリンカで作成されます。リンカ設定ファイルのセクション配置ディレクティブに従って、各セクションの配置場所を判別します。コピーによって初期化されるセクションは、配置ディレクティブに照らしてROMパート用とRAMパート用の2か所あり、それぞれ異なる属性を持ちます。配置の過程において、リンカは、コード参照をその宛先まで進めるためやCPUモードを切り替えるために必要なベニアの追加も行います。
実行可能イメージおよび提供されたすべてのデバッグ情報を含む絶対ファイルを生成します。再配置可能な入力ファイルの必要な各セクションの内容は、そのファイルおよびセクションの配置時に決定されたアドレスで提供された再配置情報を使用して計算されます。このプロセスによって、特定セクションの要件の一部が満たされないと、1つまたは複数の再配置エラーとなることがあります。たとえば、配置によって
PC関連のジャンプ命令の目的地のアドレスが、その範囲外となる場合などです。セクション配置の結果、各グローバルシンボルのアドレス、各モジュールおよびライブラリ用のメモリ使用量のサマリをリストするマップファイルを生成します(オプション)。
以下の図は、リンク処理を示しています。

リンク中、ILINK は、エラーメッセージおよびログメッセージをstdoutおよびstderrに生成します。ログメッセージは、アプリケーションがそのようにリンクされた理由を理解するときに役に立ちます。たとえば、モジュールまたはセクション(あるいはセクションフラグメント)が含まれた理由などです。
注記
ELFオブジェクトファイルの実際の内容を確認するには、ielfdumparmを使用します。IAR ELF Dumper—ielfdumparmを参照してください。