1

タイトル: アーム リンカに、第 1 領域と第 2 領域の両方が適用されている状態で、第 2 ロード領域を展開する方法「RW データ圧縮」はありますか?

以下のスキャッタ ファイルを取得しました (複雑なスキャッタ ファイルの単純なバージョン)

LOAD_REGION_01 0x0
{
    EXECUTION_REGION_01  0x0
    {
        ABC.o (+RO,+RW)
    }
}

LOAD_REGION_02 +0x0
{
   EXECUTION_REGION_02  0x100
   {
      DEF.o (+RO,+RW)
   }
}

RW データ圧縮が自動的に適用され、サイズが 0x40 (LOAD_REGION_01 の場合は 0x20、LOAD_REGION_02 の場合は 0x20) のバイナリを取得し、次の MAP ファイルとして link.info を取得しました。

Load Region LOAD_REGION_01 (Base: 0x0, Size: 0x30, Max: 0x000000a0, ABSOLUTE)
    Execution Region EXECUTION_REGION_01 (Base:0x0,Size:0x30,Max:0xffffffff,ABSOLUTE, COMPRESSED[0x20])

Load Region LOAD_REGION_02 (Base: 0x30, Size: 0x30, Max: 0x000000a0, ABSOLUTE)
    Execution Region EXECUTION_REGION_02 (Base:0x0,Size:0x30,Max:0xffffffff,ABSOLUTE, COMPRESSED[0x20])

圧縮後のロード領域のサイズは 0x20 ですが、2 番目のロード領域の開始アドレスは 0x30 であることがわかりました。そして、最初の領域の解凍は正常に動作しますが、アームはアドレス "0x20" ではなく "0x30" から 2 番目の領域を解凍しようとします。

したがって、誤った解凍結果が生成されます。アームリンカーが秒を正しく解凍する方法は? または、2 番目のロード領域 LOAD_REGION_02 のロード アドレスに属性 +0 を割り当てるにはどうすればよいですか (ロード領域 1 のサイズが変更される可能性があるため...)。

取扱説明書を全部読みましたが、答えがありません...

4

1 に答える 1

0

あなたの問題は、両方のロード領域がアドレス 0 から始まるように宣言されていることです。

ARM doc をざっと読んだところ、それを解決するための 2 つのオプションが表示されました。

  1. 1 つのロード リージョンと 2 つの exec リージョンを使用します。

    LOAD_REGION_01 0x0
    {
       EXECUTION_REGION_01  0x0
       {
          ABC.o (+RO,+RW)
       }
       EXECUTION_REGION_02  0x100
       {
          DEF.o (+RO,+RW)
       }
    }
    
  2. アドレスが重複しない 2 つのロード領域を使用します。正しく読んでいれば+0が機能するはずです。

    LOAD_REGION_01 0x0
    {
       EXECUTION_REGION_01  0x0
       {
          ABC.o (+RO,+RW)
       }
    }
    LOAD_REGION_02 +0
    {
       EXECUTION_REGION_02  0x100
       {
          DEF.o (+RO,+RW)
       }
    }
    
于 2012-06-26T13:12:36.007 に答える