1.5.4 C ライブラリでのスタティックデータの使用

スタティックデータとは、スタックやヒープ上に保存されていない永続的な読み出し/書き込みデータを意味します。C ライブラリからの呼び出しでスタティックデータにアクセスできます。

静的データは有効範囲の外部または内部のいずれにも配置でき、プログラムカウンタ(pc)を基準とした固定アドレスに保存されます(-fbare-metal-pie を使用してコンパイルされた場合)。
C ライブラリによるスタティックデータの使用形態は以下のとおりです。
  • デフォルトの浮動小数点算術演算ライブラリ fz_* および fj_* はスタティックデータを使用せず、常に再入可能です。ソフトウェア浮動小数点の場合、f_* および g_* ライブラリはスタティックデータを使用して、浮動小数点(FP)ステータスワードをストアします。ハードウェア浮動小数点の場合、f_* および g_* ライブラリはスタティックデータを使用しません。
  • C ライブラリ内の、初期化されたすべてのスタティックデータは読み出し専用です。
  • 書き込み可能なすべてのスタティックデータはゼロで初期化されます。

定義内のスタティックデータを使用する関数は、今後のリリースで変更される場合があります。
C ライブラリからの呼び出しでスタティックデータにアクセスできます。スタティックデータを使用する C ライブラリ関数は、以下のように分類できます。
  • 種類にかかわらずスタティックデータを一切使用しない関数(例:fprintf())。
  • スタティック状態を管理する関数(例:malloc()rand()strtok())。
  • スタティック状態は管理しないものの、 ARM® コンパイラの実装に固有の方法でスタティックデータを使用する関数(例:isalpha()
C ライブラリは、暗黙のスタティックデータを必要とする機能を使う場合に、置き換え可能な関数への呼び出しを使用します。次の表にこれらの関数を示します。これらの関数ではセミホスティングは使われません。

表 1-1 C ライブラリの呼び出し

関数 説明
__rt_errno_addr() 変数 errno のアドレスを取得するために呼び出されます
__rt_fp_status_addr() 浮動小数点ステータスワードのアドレスを取得するために、浮動小数点サポートコードによって呼び出されます
locale 関数 __user_libspace() 関数は、ライブラリ専用のスタティックデータブロックを作成します
__user_libspace のデフォルトの実装では、ZI 領域内に 96 バイトのブロックが作成されます。アプリケーションに main() 関数が含まれない場合でも、通常は __user_libspace() 関数を再定義する必要はありません。

定義内のスタティックデータを使用する関数は、今後のリリースで変更される場合があります。
関連する概念
1.5.7 C ライブラリでの既存の関数 __user_libspace() の再実装
1.9 C ライブラリでのロケール関数をカスタマイズするためのアセンブラマクロ
1.5.1 ARM C ライブラリとマルチスレッド
関連する参考文書
4.24 __rt_fp_status_addr()
非機密扱いPDF file icon PDF 版ARM DUI0808CJ
Copyright © 2014, 2015 ARM.All rights reserved.