1

标题:如何在第一个和第二个区域都应用“RW 数据压缩”时使 arm 链接器解压缩第二个加载区域?

我有一个下面的分散文件(我的复杂分散文件的简单版本)

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,但是第二个加载区域的起始地址是0x30!并且,第一个区域的解压缩工作正常,但是 arm 尝试从地址“0x30”而不是“0x20”解压缩第二个区域。

因此,会产生错误的解压结果。如何使arm链接器正确解压第二个?或者我如何为第二个加载区域 LOAD_REGION_02 的加载地址分配属性 +0 (因为大小加载区域 1 可能会改变......)?

我阅读了所有用户手册,但没有答案...

4

1 回答 1

0

您的问题似乎是两个加载区域都被声明为从地址 0 开始。

通过快速阅读 ARM 文档,我看到了解决它的两个选项:

  1. 使用一个加载区域和两个执行区域:

    LOAD_REGION_01 0x0
    {
       EXECUTION_REGION_01  0x0
       {
          ABC.o (+RO,+RW)
       }
       EXECUTION_REGION_02  0x100
       {
          DEF.o (+RO,+RW)
       }
    }
    
  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 回答