モジュールおよびセクション
各再配置可能オブジェクトファイルには、以下の要素で構成される1つのモジュールが含まれます。
コードまたはデータのいくつかのセクション
ランタイム環境のバージョンなど、さまざまな情報を指定するランタイム属性
DWRAFフォーマットのデバッグ情報(オプション)
使用されているすべてのグローバルシンボルおよびすべての外部シンボルのシンボルテーブル
注記
ライブラリでは、それぞれのモジュール(ソースファイル)には1つの関数のみを含める必要があります。ライブラリの関数を自分のアプリケーションの関数で上書きする場合は、これは重要です。リンカは、アプリケーションの他の部分から参照されているモジュールだけを組み込みます。もし1つのモジュール内に複数の関数が含まれていて、そのうちの1つが参照された場合、リンカはそのモジュール全体を取り込みます。その結果、同じモジュール内に含まれていた別の関数をアプリケーション側で定義して上書きしようとすると、「重複定義(duplicate definitions)」エラーが発生してしまいます。
セクションとは、メモリ内の物理位置に配置されるデータやコードを含む論理エンティティです。セクションは、いくつかのセクションフラグメントで構成できます。セクションフラグメントは、通常、各変数または関数(シンボル)に対して1つです。セクションは、RAMまたはROMのいずれかに配置できます。通常の組み込みアプリケーションでは、RAMに配置したセクションには内容がなく、エリアを占有するだけです。
各セクションには、名前とその内容を判別するための型属性が付けられています。この型属性は、ILINK設定のセクションを選択するときに(名前とともに)使用されます。
セクション属性の主要目的は、ROMに配置されるセクションとRAMに配置されるセクションを識別することです。
| ROM セクション |
| RAM セクション |
各セクションでは、さらにセクションをコード、データで分けることができ、最終的に4つの主要カテゴリになります。
| 通常のコード |
| 定数 |
| RAMにコピーしたコード |
| 変数 |
readwrite dataには、アプリケーションの起動時にゼロに初期化されるセクションのzi|zeroinitサブカテゴリがあります。
注記
これらのセクション型(アプリケーションの一部であるコードおよびデータを含むセクション)のほかに、最終オブジェクトファイルには、デバッグ情報や型の異なるメタ情報を含むセクションなど、その他多くの型のセクションが含まれます。
セクションは、最小のリンク可能ユニットです。ただし、可能な場合、ILINKは、最終アプリケーションからさらに小さいユニット(セクションフラグメント)を実行できます。詳細については、モジュールの保持およびシンボルおよびセクションの保持を参照してください。
コンパイル時に、データおよび関数は、さまざまなセクションに配置されます。リンク時、リンカの最も重要な機能の1つは、アプリケーションで使用されるさまざまなセクションにアドレスを割り当てることです。
IARビルドツールには、多くのセクション名が事前に定義されています。各sectionの詳細は、セクションリファレンスのを参照してください。
ブロックを使用して、セクションをまとめて配置することができます。define blockディレクティブを参照してください。