1.8.1 実行環境の初期化とアプリケーションの実行

__rt_entry に分岐する独自の __main を定義して、実行の初期化をカスタマイズできます。

プログラムのエントリポイントは C ライブラリ内の __main です。この位置ではライブラリコードが以下の処理を実行します。
  1. 非ルート(RO および RW)実行領域をロードアドレスから実行アドレスにコピーします。また、圧縮されているデータセクションがある場合は、これらのデータセクションをロードアドレスから実行アドレスに伸張します。
  2. ZI 領域をゼロにします。
  3. __rt_entry に分岐します。
ライブラリによる上記の動作が必要でない場合には、__rt_entry に分岐するユーザ定義の __main を使用して抑止できます。__main をエントリポイントとして指定するには、-e armclang オプションまたは --entry armlink オプションを使用します。例えば、
.global __rt_entry
  .global __main
__main:
  B__rt_entry
ライブラリ関数 __rt_entry() は、以下のようにプログラムを実行します。
  1. __user_setup_stackheap() の呼び出し、__rt_stackheap_init() の呼び出し、スキャッタロード領域の絶対アドレスのロードなど、さまざまな方法のいずれかを使用してスタックおよびヒープを設定します。
  2. __rt_lib_init() を呼び出して、参照されるライブラリ関数およびロケールを初期化します。さらに必要であれば、main()argcargv をセットアップします。
    C++ の場合は、__cpp_initialize__aeabi_ を使用して任意のトップレベルオブジェクトのコンストラクタを呼び出します。
  3. アプリケーションのユーザレベルルートである main() を呼び出します。
    main() で実行される処理の一環として、ライブラリ関数への呼び出しが実行される場合があります。
  4. main() によって返された値を使用して exit() を呼び出します。
関連する概念
1.8.4 main() から呼び出されるライブラリ関数
1.8 新しい実行環境に合わせた C ライブラリのカスタマイズ
1.8.2 C++ の初期化、構築、および破棄
関連する参考文書
1.6.5 C ライブラリ関数の直接セミホスティング依存関数
4.22 __rt_entry
4.26 __rt_lib_init()
非機密扱いPDF file icon PDF 版ARM DUI0808CJ
Copyright © 2014, 2015 ARM.All rights reserved.