8.7 相対ベースアドレスのロード領域と ZI 実行領域を含むスキャッタファイル

以下のように、1 つのロード領域にゼロで初期化された(ZI)データを配置し、次のロード領域に相対ベースアドレスを使用する例を考えます。

ロード領域 LR1 に ZI データを配置し、次のロード領域 LR2 に相対ベースアドレスを使用するには、たとえば、次のようにします。
LR1 0x8000
{
    er_progbits +0
    {
        *(+RO,+RW) ; ロード領域にスペースを確保する
    }
    er_zi +0
    {
        *(+ZI) ; ロード領域にスペースを確保しない
    }
}
LR2 +0 ; LR1 の直後のロード領域
{
    er_moreprogbits +0
    {
        file1.o(+RO) ; ロード領域にスペースを確保する
    }
}
リンカは、ZI データに合わせて LR2 のベースアドレスを調整することをしないため、実行領域 er_zi は、実行領域 er_moreprogbits とオーバラップします。リンク時には、これが原因でエラーが生成されます。
これを解決するには、ImageLimit() 関数に ZI 実行領域の名前を指定して、LR2 のベースアドレスを計算します。以下に例を示します。
LR1 0x8000
{
    er_progbits +0
    {
        *(+RO,+RW) ; ロード領域にスペースを確保する
    }
    er_zi +0
    {
        *(+ZI) ; ロード領域にスペースを確保しない
    }
}
LR2 ImageLimit(er_zi) ; LR2 のアドレスを er_zi の上限に設定
{
    er_moreprogbits +0
    {
        file1.o(+RO) ; ロード領域にスペースを確保する
    }
}
関連する概念
8.6 スキャッタファイル内の式の評価
8.6.3 スキャッタファイルでの式の使用
8.6.4 スキャッタファイル内の式の規則
8.6.5 スキャッタファイルで使用する実行アドレスの組み込み関数
関連する参考文書
8.2 スキャッタファイルの構文
8.3.2 ロード領域記述の構文
8.4.2 実行領域の記述に含まれている構文
6.3.2 Image$$ 実行領域シンボル
非機密扱いPDF file icon PDF 版ARM DUI0474LJ
Copyright © 2010-2015 ARM.All rights reserved.