我的链接描述文件中有以下行
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
只有这样,链接器才能正常运行。
答案 0 :(得分:1)
所以这就是我发现的。也许这可以节省一些令人沮丧的调试时间。
我的主要问题是需要将一段汇编代码链接到SRAM空间并从闪存空间加载。所以VMA必须是SRAM地址,LMA是闪存地址。
过去,我总是成功完成上述c文件中定义的功能/数据。我需要做的就是分配一个section属性并适当地修改链接器脚本。
推理1:链接器允许标准TEXT和DATA部分使用不同的LMA,尽管可以使用section属性对它们进行不同的命名。
在程序集文件中尝试相同时没有这样的运气。链接器拒绝承认上面定义的输入节.JumpTable实际上是用户定义的TEXT部分。
然后解决方案
将汇编代码移动到新文件JumpTable.S。
将输入部分.JumpTable重命名为.text
按如下所示修改链接器文件
.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
也许有更好的解释/另一个根本原因。但这确实挽救了我的一天。