__at セクションの自動配置

__at セクションの自動配置はデフォルトで有効になっています。 この機能を制御するには、リンカコマンドラインオプション --autoat を使用します。

Note

__at セクションは、位置非依存の実行領域では使用できません。

--autoat オプションを使用してリンクするとき、__at セクションはスキャッタロードセレクタによって配置されません。 代わりに、リンカによって __at セクションは互換領域に配置されます。 互換領域が見つからない場合は、__at セクションのロード領域と実行領域が作成されます。

リンカの --autoat オプションによって作成された実行領域はすべて UNINIT スキャッタロード属性を持ちます。 ZI __at セクションをゼロで初期化する必要がある場合、このセクションは互換領域内に配置する必要があります。 リンカの --autoat オプションによって作成された実行領域のベースアドレスは少なくとも 4 バイト境界で整列されている必要があります。 領域が正しく整列されいない場合は、リンカのエラーメッセージが生成されます。

互換領域とは、以下のような領域です。

以下の例には、種類が RO のセクション .ARM.__at_0x0、種類が RW のセクション .ARM.__at_0x2000、種類が ZI のセクション .ARM.__at_0x4000、および種類が ZI のセクション .ARM.__at_0x8000 を示しています。

Example 20. C または C++ コードでの変数の配置

// RW 変数を .ARM.__at_0x2000 という名前のセクションに配置する
int foo __attribute__((section(".ARM.__at_0x2000"))) = 100;

// ZI 変数を .ARM.__at_0x4000 という名前のセクションに配置する
int bar __attribute__((section(".ARM.__at_0x4000"), zero_init));

// ZI 変数を .ARM.__at_0x8000 という名前のセクションに配置する
int variable __attribute__((section(".ARM.__at_0x8000"), zero_init));

Example 21. __at セクションの自動配置

LR1 0x0
{
    ER_RO 0x0 0x2000
    {
        *(+RO)      ; .ARM.__at_0x0 は ER_RO の範囲内にある
    }
    ER_RW 0x2000 0x2000
    {
        *(+RW)      ; .ARM.__at_0x2000 は ER_RW の範囲内にある
    }
    ER_ZI 0x4000 0x2000
    {
        *(+ZI)      ; .ARM.__at_0x4000 は ER_ZI の範囲内にある
    }
}

; __at セクション .ARM.__at_0x8000 は対象となるすべての領域の範囲外にあるため
; そのロード領域と実行領域がリンカによって作成される。

Show/hide関連項目

Copyright © 2010-2012 ARM. All rights reserved.ARM DUI 0474GJ
Non-ConfidentialID051612