適用範囲:Arm Compiler 6
背景:
Arm Compiler 5(armcc)ではzero_init属性を使用することで、修飾されていない(.bssを前に付けない)名前を用いてZIデータセクションに変数を配置できます。
その後、リンカ定義の入力セクションシンボルを使用してそのセクションの開始アドレスにアクセスできます。
例:
/*! armccで変数をZIセクション"myData"に配置 */
__attribute__ ((section(“myData”), zero_init)) uint32_t g_wDemo;
/*! ZIセクション"myData"のベースアドレスは以下のシンボルでアクセス可能 */
extern uint32_t myData$$Base;
Arm Compiler 6(armclang)では、変数属性zero_initはサポートされていません。
変数を以前のように特定のZIデータセクションに配置するには、セクション名が.bss.から始まる必要があります。
例:
/*! armclangで変数をZIセクション"myData"に配置 */
__attribute__ ((section(“.bss.myData)) uint32_t g_wDemo;
ただし、リンカによって生成される入力セクションシンボルのフォーマットは有効なC/C++シンボル名ではない.bss.xxxx$$Baseとなってしまいます。
例:
/*! 以下は正しいC/C++ シンボル名ではない */
extern uint32_t .bss.myData$$Base;
回避策:
この問題を解消するために以下のいずれかの方法を使用できます:
- より直接的なMethod A
- ツールチェイン間のバイナリ間の運用性がより高いMethod B
Method A:キーワード__asm__を使用
Arm Compiler 5とArm Compiler 6は変数に異なったシンボル名を与えることができるキーワード__asm__をいずれもサポートしています。
例:
/*! armccで変数をZIセクション"myData"に配置 */
__attribute__ ((section(“.bss.myData”))) uint32_t g_wDemo;
/*! ZIセクション"myData"のベースアドレスはCからアクセス可能 */
extern uint32_t myData __asm__(“.bss.myData$$Base”);
注意:キーワード __asm__ は非Armツールチェインでサポートされるかは保証されません。
Method B: ブリッジシンボルを定義する
ZIセクションのリンカ定義シンボルを直接インポートすることはできませんが、これらのシンボルはアセンブリ言語からは変わらずアクセスすることができます。
ブリッジとなる新しいシンボルをアセンブラで定義することにより、ターゲットとするZIセクションの開始アドレスにC/C++ソースコードからアクセスできます。
たとえば、Cソースファイルで以下のようにZI変数を宣言します:
__attribute__ ((section(".bss.myData"))) uint32_t g_wDemo;
アセンブラソースコードで、リンカ生成シンボルのための新しいシンボルを作成します:
; Armスタイルのシンタックスで書かれたアセンブリコード
IMPORT |.bss.myData$$Base|
EXPORT myData
myData DCD |.bss.myData$$Base|
// GNUスタイルのシンタックスで書かれたアセンブリコード
.global .bss.myData$$Base
.global myData .type myData, "common"
myData: .word .bss.myData$$Base
Cソースファイルでは、新しいシンボルへの参照を追加できます:
/* .bss.myDataのアドレス */
extern const uint32_t *myData;
この後、定数ポインタmyDataを経由してZIセクション.bss.myDataのスタートアドレスを読み出すことができます。