| |||
Home > ディレクティブリファレンス > その他のディレクティブ > AREA |
AREA
ディレクティブは、新しいコードセクションまたはデータセクションをアセンブルするようアセンブラに指示します。
これらのセクションは、ンカによって操作される、名前付きで独立した分割不可能なコードまたはデータのかたまりです。
AREA
sectionname
{,attr
}{,attr
}...
各パラメータには以下の意味があります。
sectionname
セクションに割り当てる名前を指定します。
セクションには任意の名前を指定できます。 ただし、アルファベット以外の文字で始まる名前は縦棒で囲む必要があります。これに反すると、セクション名エラーが生成されます。
例えば、|1_DataArea|
のように記述します。
定型の名前は従来どおりです。 例えば、|.text|
は、C コンパイラによって生成されるコードセクション、または
C ライブラリに関連付けられたコードセクションに使用されます。
attr
1 つ以上のセクション属性をコンマで区切って指定します。 有効な属性は以下のとおりです。
ALIGN=expression
デフォルトでは、ELF セクションは 4 バイト境界で整列されます。
には
0 ~ 31 の任意の整数値を指定できます。このセクションは 2expression バイト境界で整列されます。
例えば、expression に 10 が指定されている場合、このセクションは 1KB
境界で整列されます。expression
これは、ALIGN
ディレクティブの指定方法とは異なります。
ARM コードセクションには ALIGN=0
または ALIGN=1
を使用しないで下さい。
Thumb コードセクションには ALIGN=0
を使用しないで下さい。
ASSOC=section
には、関連する
ELF セクションを指定します。section
は、sectionname
を含むすべてのリンクに含まれている必要があります。section
CODE
マシン命令を保持します。 READONLY
がデフォルトです。
CODEALIGN
ALIGN
ディレクティブが異なるパディングを指定しない限り、セクション内の ALIGN
ディレクティブが
ARM または Thumb 命令後に使用される際に、アセンブラによって NOP
命令が挿入されます。
COMDEF
共通セクションの定義です。 この ELF セクションは、コードまたはデータを保持できます。 このセクションは、他のソースファイル内にある同じ名前の付いた他のセクションと同じである必要があります。
同じ名前の付いた同一の ELF セクションは、リンカによって同じメモリセクションにオーバーレイされます。 これらのセクションが異なっている、リンカによって警告メッセージが生成され、セクションのオーバーレイは行われません。
COMGROUP=symbol_name
名前付きの ELF セクショングループの AREA
の部分となる署名を指定します。
詳細については、GROUP=
を参照して下さい。 symbol_name
COMGROUP
属性は、ELF
セクショングループを GRP_COMDAT
フラグでマークします。
COMMON
共通データセクションです。 このセクション内ではコードまたはデータは定義できません。 このセクションは、リンカによってゼロに初期化さます。 同じ名前の付いたすべての共通セクションは、リンカによって同じメモリセクションにオーバーレイされます。 すべてのセクションが同サイズである必要はありません。 リンカは、同じ名前の付いたセクションのうち最も大きな共通セクションに必要とされるだけの空間を割り当ます。
DATA
命令ではなくデータを保持します。 READWRITE
がデフォルトです。
FINI_ARRAY
現在の領域の ELF 型を SHT_FINI_ARRAY
に設定します。
GROUP=symbol_name
名前付きの ELF セクショングループの AREA
の部分となる署名を指定します。
ソースファイル、またはソースファイルによってインクルードされるファイルによって定義される必要があります。 同じ
署名のすべての symbol_name
AREAS
は、同じグループの部分になります。
グループ内のセクションは、一緒に保持または破棄されます。
INIT_ARRAY
現在の領域の ELF 型を SHT_INIT_ARRAY
に設定します。
LINKORDER=section
イメージ内での現在のセクションの相対的な位置を指定します。 その結果、LINKORDER
属性を備えるセクションすべての順序が、互いに関してイメージ内で対応する名前付き
の順序と同じになります。sections
MERGE=n
リンカが現在のセクションを MERGE=
属性を備えた他のセクションとマージできることを示します。n
n
はセクション内の要素のサイズです。例えば、文字の場合には n
は
1 です。 この属性があってもリンカはセクションのマージを強制されないので、必ずしもセクションがマージされるとは限りません。
NOALLOC
ターゲットシステム上のメモリがこのエリアに割り当てられないことを示します。
NOINIT
データセクションが初期化されていないか、またはゼロに初期化されていることを示します。 この属性に含まれるのは、空間予約ディレクティブ SPACE
か、初期値がゼロに設定された DCB
、DCD
、DCDU
、DCQ
、DCQU
、DCW
、または DCWU
ディレクティブだけです。
エリアを初期化しないか、またはゼロで初期化するかはリンク時に決めることができます。
PREINIT_ARRAY
現在の領域の ELF 型を SHT_PREINIT_ARRAY
に設定します。
READONLY
このセクションへの書き込みが禁止されていることを示します。 コードエリアの場合はこれがデフォルトです。
READWRITE
このセクションに対する読み出しと書き込みが可能なことを示します。 データエリアの場合はこれがデフォルトです。
SECFLAGS=n
現在のセクションに ELF フラグを 1 つ以上(n
で指定されます)追加します。
SECTYPE=n
現在のセクションの ELF 型を n
に設定します。
STRINGS
現在のセクションに SHF_STRINGS
フラグを追加します。 STRINGS
属性を使用するには、MERGE=1
属性も使用する必要があります。
セクションのコンテンツは、DCB
ディレクティブを使用して NULL で終わる文字列である必要があります。
AREA
ディレクティブを使用して、ソースファイルを複数の ELF セクションに分割します。
複数の AREA
ディレクティブで同じ名前を使用できます。 同じ名前の付いたエリアはすべて、同じ ELF
セクションに配置されます。 特定の名前の付いた最初 AREA
ディレクティブの属性だけが適用されます。
通常、コードとデータには別々の ELF セクションを使用する必要があります。 ただし、コードセクションにはデータを配置することができます。 大きなプログラムは、扱いやすいように複数のコードセクションに分割できます。 また、大きな独立データセットも別々のセクションに配置するのが適切です。
ローカルラベルの有効範囲は、AREA
ディレクティブによって定義され、必要に応じて ROUT
ディレクティブによって分割されます。
アセンブリには少なくとも 1 つの AREA
ディレクティブが必要です。
ディレクティブが PC 相対の式を使用していて、PREINIT_ARRAY
、FINI_ARRAY
、または INIT_ARRAY
ELF
セクション内にある場合、アセンブラは DCD
および DCDU
ディレクティブの R_ARM_TARGET1
再配置を生成します。
各 DCD
または DCDU
ディレクティブの後で RELOC
ディレクティブを使用して、再配置をオーバーライドできます。
この再配置を使用する場合、読み出し/書き込みセクションは、プラットフォー ABI が許可すれば、リンク時に読み出し専用セクションになります。
『アセンブラの使用』:
『リンカの使用』: