7.13.4 タイプ 3 のイメージ:複数のロード領域と連続しない実行領域

タイプ 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_ROER_RWER_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_XOER_ROER_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)
     }
}
関連する概念
8.3 ロード領域の記述
8.3.6 ロード領域に相対アドレス +offset を使用する際の注意事項
8.4.5 実行領域に相対アドレス +offset を使用する際の注意事項
8.3.4 ロード領域のアドレス属性の継承規則
8.3.5 RELOC アドレス属性の継承規則
8.4.4 実行領域のアドレス属性の継承規則
関連する参考文書
12.115 --reloc
12.118 --ro_base=address
12.122 --rw_base=address
12.135 --split
12.170 --xo_base=address
8.3.3 ロード領域の属性
非機密扱いPDF file icon PDF 版ARM DUI0474LJ
Copyright © 2010-2015 ARM.All rights reserved.