タイプ 3 のイメージは、ロードビュー内の複数のロード領域と、実行ビュー内の複数の実行領域から構成されます。このタイプのイメージはタイプ 2 のイメージと似ていますが、このイメージではタイプ 2 の 1 つのロード領域が複数のロード領域に分割されます。
以下のリンカオプションを使用して、ロード領域を再配置および分割できます。
--reloc
-
--reloc --split
の組み合わせを使用すると、単純タイプ 3 に似たイメージが生成されますが、2 つのロード領域には RELOC
属性が設定されます。
注
オブジェクトファイルに実行のみセクションが含まれている場合、このオプションは使用できません。
- --ro_base=
address1
-
RO 出力セクションを含んでいる領域のロードアドレスと実行アドレスを指定します。
- --rw_base=
address2
-
RW 出力セクションを含んでいる領域のロードアドレスと実行アドレスを指定します。
- --xo_base=
address3
-
実行専用(XO)出力セクション(存在する場合)を含んでいる領域のロードアドレスと実行アドレスを指定します。
--split
-
RO 出力セクションと RW 出力セクションを含んでいるデフォルトの 1 つのロード領域を 2 つのロード領域に分割します。これにより、一方のロード領域には RO 出力セクションが含められ、もう一方のロード領域には RW 出力セクションが含められます。
注
XO セクションを含むイメージで、--xo_base
を使用しない場合、XO 実行領域は --ro_base
で指定されたアドレスに配置されます。RO 実行領域は、XO 領域のすぐ後に配置されます。
複数のロード領域の例
以下の例では、--ro_base=0x010000
--rw_base=0x040000
--split
を使用することと同じ意味を持つスキャッタロード記述を示しています。
LR_1 0x010000 ; 最初のロード領域を 0x010000 から開始する。
{
ER_RO +0 ; アドレスは 0x010000 になる。
{
* (+RO)
}
}
LR_2 0x040000 ; 2 番目のロード領域を 0x040000 から開始する。
{
ER_RW +0 ; アドレスは 0x040000 になる。
{
* (+RW) ; すべての RW セクションはこの領域に連続して配置される。
}
ER_ZI +0 ; アドレスは 0x040000 + ER_RW 領域のサイズになる。
{
* (+ZI) ; すべての ZI セクションはこの領域に連続して配置される。
}
}
この例では、以下のようになります。
-
0x010000
と
0x040000
をロードアドレスとする 2 つのロード領域 LR_1
および LR_2
を含んでいるイメージが作成されます。
- このイメージには、
ER_RO
、ER_RW
、ER_ZI
という 3 つの実行領域があり、それぞれ RO、RW、ZI の各出力セクションを含んでいます。ER_RO
の実行アドレスは
0x010000
です。
-
ER_RW
実行領域は、実行アドレスが
0x040000
であるため、ER_RO
実行領域と隣接していません。
-
ER_ZI
実行領域は、ER_RW
のすぐ後に配置されます。
複数のロード領域と XO 領域の例
以下の例では、オブジェクトファイルに XO セクションがある場合に、--ro_base=0x010000
を使用することと同じ意味を持つスキャッタロード記述を示しています。
LR_1 0x010000 ; 最初のロード領域を 0x010000 から開始する。
{
ER_XO +0 ; アドレスは 0x010000 になる。
{
* (+XO)
}
ER_RO +0 ; アドレスは 0x010000
; + ER_XO 領域のサイズになる。
{
* (+RO)
}
}
LR_2 0x040000 ; 2 番目のロード領域を 0x040000 から開始する。
{
ER_RW +0 ; アドレスは 0x040000 になる。
{
* (+RW) ; すべての RW セクションはこの領域に連続して配置される。
}
ER_ZI +0 ; アドレスは 0x040000 + ER_RW 領域のサイズになる。
{
* (+ZI) ; すべての ZI セクションはこの領域に連続して配置される。
}
}
この例では、以下のようになります。
-
0x010000
と
0x040000
をロードアドレスとする 2 つのロード領域 LR_1
および LR_2
を含んでいるイメージが作成されます。
- このイメージには、
ER_XO
、ER_RO
、ER_RW
、および ER_ZI
という 4 つの実行領域があり、それぞれ XO、RO、RW、ZI の各出力セクションを含んでいます。ER_XO
の実行アドレスは、--ro_base
、
0x010000
で指定されるアドレスに配置されます。ER_RO
は、ER_XO
のすぐ後に配置されます。
-
ER_RW
実行領域は、実行アドレスが
0x040000
であるため、ER_RO
実行領域と隣接していません。
-
ER_ZI
実行領域は、ER_RW
のすぐ後に配置されます。
注
--xo_base
も指定する場合、ER_XO
実行領域は、ER_RO
実行領域のものとは別のロード領域に指定されたアドレスで配置されます。
再配置可能なロード領域の例
このタイプ 3 のイメージも、ロードビュー内の 2 つのロード領域と、実行ビュー内の 3 つの実行領域から構成されます。ただし、2 つのロード領域が RELOC
属性をもつことは、--reloc
で指定します。
以下の例では、--ro_base 0x010000
--rw_base 0x040000
--reloc --split
を使用することと同じ意味を持つスキャッタロード記述を示しています。
LR_1 0x010000 RELOC
{
ER_RO + 0
{
* (+RO)
}
}
LR2 0x040000 RELOC
{
ER_RW + 0
{
* (+RW)
}
ER_ZI +0
{
* (+ZI)
}
}