我正在尝试写一个ld文件作为我的cortex m0板的链接脚本。现在有一个问题,当我需要在SRAM的末端放置一个输出部分时,我只希望链接器能够自动计算LMA。ld文件的切片如下所示:
. = 0x22000 - SIZEOF(.bss_retain);
.bss_retain . (NOLOAD):
{
__bss_retain_start__ = ALIGN(4);
...
字符串
0x22000是SRAM的结束。输出Map文件如下所示:
0x00021fa0 . = (0x22000 - SIZEOF (.bss_retain))
.bss_retain 0x00022000 0x60
0x00022000 __bss_retain_start__ = ALIGN (0x4)
型
似乎已为位置计数器分配了正确的值,而LMA.bss_retain是意外的。
我想知道这是怎么回事?这个问题有没有解决的办法?
2条答案
按热度按时间5anewei61#
像这样使用节会让
ld
感到困惑。他们很少工作。字符串
问题是'.'位置在一个部分的内部和外部有不同的含义。为了让这个工作,我建议你创建一个单独的memory region,并把
bss_retain
在该区域。存储器区域不需要是物理设备。这是确定的,渴望一个物理设备到单独的分区。如果您需要放置代码,那么LMA/VMA将是一个问题。顺便说一下,我认为问题是VMA,而不是LMA(但我认为VMA是你的意思)。“加载地址”仅对初始引导有影响,初始引导可能会复制“初始化数据”(以及在某些情况下要重新定位的代码)。r6hnlfcb2#
我和我的队友讨论了这个奇怪的场景,我们找到了一个解决方案,尽管我们不能确切地弄清楚为什么这样做是有效的:x1c 0d1x的数据
似乎我们需要重新计算SIZEOF(.bss_retain)后定义的节时,链接器可能知道确切的真实的大小。但仍然令人困惑的是,为什么以前的解决方案不起作用。
1.如果在定义节之前计算大小是无效的,为什么位置计数器的值是“”。= 0x 22000- SIZEOF(.bss_retain)”是否正确,链接是否成功?
1.如果它是有效的,为什么VMA是SRAM(0x 22000)的结尾?