7.2.5 __attribute__((section("name"))) を使用したコードとデータの配置

コードおよびデータは、ツールチェーン固有のプラグマや属性を使用しなくても、独自のオブジェクトに別々に配置できます。

ただし、 __attribute__((section("name"))) を使用して、項目を別の ELF セクションに配置することもできます。その場合、スキャッタファイルを使用して、名前付きセクションを特定の位置に配置できます。

__attribute__((section("name"))) を使用して、変数を別のセクションに配置するには、以下の手順を実行します。
  1. __attribute__((section("name"))) を使用して、変数の配置先の名前付きセクションを指定します。以下に例を示します。
    セクションの命名
    int variable __attribute__((section("foo"))) = 10;
  2. スキャッタファイルを使用して、名前付きセクションを配置します。以下に例を示します。
    セクションの配置
    FLASH 0x24000000 0x4000000
    {
        …                                ; 残りのコード
        ADDER 0x08000000
        {
            file.o (foo)                  ; file.o からセクション foo を選択する
        }
    }
次の例は FLASH ロード領域のメモリマップを示します。
…
  Load Region FLASH (Base: 0x24000000, Size: 0x00000004, Max: 0x04000000, ABSOLUTE)
    Execution Region ADDER (Base: 0x08000000, Size: 0x00000004, Max: 0xffffffff, ABSOLUTE)
    Base Addr    Size         Type   Attr      Idx    E Section Name        Object
    0x08000000   0x00000004   Data   RW           16    foo                 file.o
…
以下の点に注意して下さい。
  • --autoat または --no_autoat によるリンクは配置に影響しません。
  • スキャッタロードが使用されなかった場合、セクションは、LR_1 ロード領域のデフォルトの ER_RW 実行領域に配置されます。
  • スキャッタファイルはあるが、foo セレクタは含まれないという場合、セクションは、定義されている RW 実行領域に配置されます。
セクション名に .ARM.__at_address を使用することで、特定のアドレスに関数を配置することもできます。例えば、関数 sqr 0x20000 に配置するには、次のように指定します。
int sqr(int n1) __attribute__((section(".ARM.__at_0x20000")));
int sqr(int n1)
{
    return n1*n1;
}
関連する概念
7.2.6 特定のアドレスに __at セクションの配置
7.2.7 __at セクションの配置に関する制限
関連する参考文書
12.10 --autoat、--no_autoat
12.125 --scatter=filename
関連情報
__attribute__((section("name"))) 関数属性
__attribute__((section("name"))) 変数属性
#pragma arm section [section_type_list]
非機密扱いPDF file icon PDF 版ARM DUI0474LJ
Copyright © 2010-2015 ARM.All rights reserved.