2012-12-07 74 views
1

我有以下线在我的链接脚本GNU链接和链接描述:链接器不产生正确的LMA

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链接器问题吗?

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

我正面临这个问题,因为该部分是在程序集文件中定义的。

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

编辑 - 解决方案: 事实证明,.JumpSection必须用正确的属性进行定义: .section伪“.JumpSection”,‘斧’,PROGBITS%

只有这样,连接器的行为正确。

回答

1

所以这里是我发现的。也许这可以帮助人们避免几个令人沮丧的调试问题。

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

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

INFERENCE 1:链接器允许标准TEXT和DATA部分使用不同的LMA,尽管使用section属性可以命名为不同的LMA。

在装配文件中试图做到这一点时,没有这种运气。链接器拒绝确认上面定义的输入节.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 
    

也许有一个更好的解释/另一根源。但是这确实节省了我的一天。