相対ベースアドレスのロード領域と 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) ; ロード領域にスペースを確保する
    }
}

Show/hide関連項目

Copyright © 2010-2012 ARM. All rights reserved.ARM DUI 0493GJ
Non-ConfidentialID051612