GNU链接器和链接器脚本:链接器不生成正确的LMA

时间:2012-12-07 08:29:23

标签: linker overlay gnu memory-address linker-scripts

我的链接描述文件中有以下行

JumpTable ABSOLUTE(0x2000000C): AT(eROData)
{
    JumpTableStart = .;
    *(.JumpSection);
    . = ALIGN(4);
    JumpTableEnd = .;
} > SRAM

eROData是来自闪存的地址,并假设值为0x1000xxxx

链接后,我注意到链接器将VMA和LMA分配给JumpTable部分。 这是列表文件中的列表。

 2 .rodata       00000004  10001214  10001214  00001214  2**2

              CONTENTS, ALLOC, LOAD, READONLY, DATA

 3 JumpTable     00000140  2000000c  2000000c  00008954  2**2

              CONTENTS, READONLY

.data部分没有这样的问题。

这是一个已知的GNU链接器问题吗?

编辑: 我注意到如果在C文件中定义了“.JumpSection”部分,则LMA被正确分配。

我遇到了这个问题,因为该部分是在程序集文件中定义的。

你以前遇到过这个问题吗?

编辑 - 解决方案: 事实证明,必须使用正确的属性定义.JumpSection:      .section“.JumpSection”,“ax”,%progbits

只有这样,链接器才能正常运行。

1 个答案:

答案 0 :(得分:1)

所以这就是我发现的。也许这可以节省一些令人沮丧的调试时间。

我的主要问题是需要将一段汇编代码链接到SRAM空间并从闪存空间加载。所以VMA必须是SRAM地址,LMA是闪存地址。

过去,我总是成功完成上述c文件中定义的功能/数据。我需要做的就是分配一个section属性并适当地修改链接器脚本。

推理1:链接器允许标准TEXT和DATA部分使用不同的LMA,尽管可以使用section属性对它们进行不同的命名。

在程序集文件中尝试相同时没有这样的运气。链接器拒绝承认上面定义的输入节.JumpTable实际上是用户定义的TEXT部分。

然后解决方案

  1. 将汇编代码移动到新文件JumpTable.S。

  2. 将输入部分.JumpTable重命名为.text

  3. 按如下所示修改链接器文件

     .text :
    
    {
    
    *(EXCLUDE_FILE(*JumpTable.o) .text); /* Exclude .text of JumpTable.o and place others */
    
    } > FLASH
    
    
    JumpTable ABSOLUTE(0x2000000C) : AT (eROData) /* Link to SRAM and Load after const data */
    
     {
    
       JumpTableStart = .;
    
       *JumpTable.o(.text); /* Place .text of JumpTable.o into JumpTable output section) */
    
       JumpTableEnd = .;
    
     } > SRAM
    
  4. 也许有更好的解释/另一个根本原因。但这确实挽救了我的一天。