3.1.5 イメージのエントリポイント

イメージ内のエントリポイントは、PC にロードされる位置です。これは、プログラムの実行開始位置です。イメージには複数のエントリポイントが存在することがありますが、リンクの際に指定できるのは 1 つだけです。

また、すべての ELF ファイル内にエントリポイントを指定する必要があるわけではありません。1 つの ELF ファイル内に複数のエントリポイントを指定することはできません。

組み込み Cortex-M プログラムの場合、このプログラムはリセットベクタから PC にロードされる値から開始します。通常、リセットベクタは CMSIS Reset_Handler 関数を指します。

エントリポイントの種類

エントリポイントには以下の 2 つの種類があります。
初期エントリポイント
イメージの初期エントリポイントは 1 つの値で表され、ELF ヘッダファイルに格納されています。オペレーティングシステムまたはブートローダによって RAM にロードされるプログラムの場合、ローダはイメージ内の初期エントリポイントに制御を渡すことによって、イメージの実行を開始します。
1 つのイメージ内で使用できる初期エントリポイントは 1 つだけです。初期エントリポイントとして、ENTRY ディレクティブによって設定されたエントリポイントの 1 つを使用できますが、必ずしもそうする必要はありません。
ENTRY ディレクティブによって設定されたエントリポイント
イメージにはエントリポイントに設定できる箇所は数多くありますが、そこから 1 つを選択します。1 つのイメージ内で使用できるエントリポイントは 1 つだけです。
アセンブラファイルで ENTRY ディレクティブを使用して、オブジェクト内にエントリポイントを作成します。組み込みシステムの場合、一般に、このディレクティブはプロセッサ例外ベクタ(RESET、IRQ、FIQ など)経由で開始されるコードをマークするために使用されます。
このディレクティブでは、ENTRY キーワードを使用して、リンカによって未使用セクションが削除されるときに残しておく出力コードセクションをマークすることにより、そのセクションを残しておくことができます。
C や C++ で記述されたプログラムの場合、C ライブラリの __main() 関数もエントリポイントとなります。
組み込みイメージがローダによって使用される場合には、そのイメージのヘッダ内に 1 つの初期エントリポイントが指定されている必要があります。エントリポイントを選択するには、--entry コマンドラインオプションを使用します。

イメージの初期エントリポイント

イメージの初期エントリポイントは 1 つだけです。そうでない場合、リンカによって警告 L6305W が出力されます。

初期エントリポイントは、以下の条件を満たしている必要があります。
  • イメージのエントリポイントは常に実行領域内に存在している必要がある。
  • 実行領域が別の実行領域のオーバーレイを行っておらず、ルート実行領域である。つまり、ロードアドレスと実行アドレスは同じである。
--entry オプションを使用せずに初期エントリポイントを指定する場合は、以下のようになります。
  • 入力オブジェクトに、ENTRY ディレクティブによって設定された 1 つのエントリポイントしか含まれていない場合には、リンカはそのエントリポイントをイメージの初期エントリポイントとして使用します。
  • リンカは以下のいずれかの場合に、初期エントリポイントが含まれていないイメージを生成します。
    • ENTRY ディレクティブによって複数のエントリポイントが指定されている場合。
    • ENTRY ディレクティブによって指定されているエントリポイントが存在しない場合。
アドレスのゼロに ROM が配置される組み込みアプリケーションの場合は、--entry 0x0 を使用します(または上位ベクタを使用するプロセッサでは、オプションとして 0xFFFF0000 を使用します)。

Cortex-M7 などの一部のプロセッサは、構成によっては異なるアドレスから起動できます。
関連する概念
7.2 ルート実行領域
関連する参考文書
12.50 --entry=location
非機密扱いPDF file icon PDF 版ARM DUI0474LJ
Copyright © 2010-2015 ARM.All rights reserved.