11.4 RVCT v2.2 と RVCT v3.0 の間での C および C++ ライブラリの変更点

RVCT 3.0 ではさまざまな変更が ARM C および C++ ライブラリに加えられました。

関数 __user_initial_stackheap() は、初期スタックおよびヒープの位置を設定し、返します。RVCT v3.x 以降では、__user_setup_stackheap() を代わりに使用するようにソースコードを変更することをお勧めします。 ARM C ライブラリおよび C++ ライブラリの古いバージョンとの下位互換性のために __user_initial_stackheap() は今でもサポートされています。

__user_initial_stackheap() の使用を継続する場合、RVCT v3.0 に加えられた以下の変更点に注意する必要があります。

  • RVCT v2.x 以前のバージョンでは、 __user_initial_stackheap() のデフォルトの実装で、シンボル Image$$ZI$$Limit の値が使用されました。--scatter リンカコマンドラインオプション付きでスキャッタファイルを指定した場合、このシンボルは定義されません。このため、スキャッタファイルを使用する場合は、__user_initial_stackheap() を再実装してヒープとスタックの境界を設定する必要があります。再実装しないと、リンク手順が正常に実行されません。

    RVCT v3.x 以降のバージョンでは、 __user_initial_stackheap() の複数実装が ARM C ライブラリによって提供されています。RVCT は、スキャッタファイルにある情報を使用して適切な実装を自動的に選択します。つまり、スキャッタファイルを使用する場合、この関数を再実装する必要はありません。

  • アプリケーションを RVCT v2.2 から RVCT v3.0 に移行する場合、以下のリンカのエラーが表示される場合があります。

    Error L6218E:Undefined symbol main (referred from kernel.o).
    

    このエラーによって、リンカは、アプリケーションに main() 関数が含まれていないことをレポートします。このエラーは、RVCT v3.0 による __user_initial_stackheap() の複数実装からの選択方法が原因となって生成されます。これらの実装は、 __rt_exit() 関数を参照します。これは、 kernel.o に含まれていますが、それは __rt_lib_init() 関数も含んでいます。__rt_lib_init() 関数が main() を呼び出すため、 main() が存在しない場合に未定義のシンボルエラーが発生します。

    C コードのエントリポイントとして main() 関数が指定されていない場合、最も簡単な解決策は、以下のいずれかの実装です。

    • 空のダミー main() 関数

    • __rt_exit() のダミー実装

    これらのスタブのいずれかが別のソースファイルに含まれている場合は、通常、リンカの未使用セクションの削除処理によってスタブが削除されます。したがって、最終のリンク先イメージにはオーバーヘッドはありません。

関連する参考文書
11.1 RVCT v2.2 と RVCT v3.0 の間での全般的な変更点
関連情報
未使用セクションの削除
イメージシンボル
__user_setup_stackheap()(なし)
古い関数 __user_initial_stackheap()(なし)
--scatter=filename リンカオプション
非機密扱いPDF file icon PDF 版ARM DUI0530JJ
Copyright © 2010-2013 ARM.All rights reserved.