gcc 如何反向计算ld文件中输出节的VMA值

cngwdvgl  于 2023-08-06  发布在  其他
关注(0)|答案(2)|浏览(131)

我正在尝试写一个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是意外的。
我想知道这是怎么回事?这个问题有没有解决的办法?

5anewei6

5anewei61#

像这样使用节会让ld感到困惑。他们很少工作。

. = 0x22000 - SIZEOF(.bss_retain);
.bss_retain . (NOLOAD):
{

字符串
问题是'.'位置在一个部分的内部和外部有不同的含义。为了让这个工作,我建议你创建一个单独的memory region,并把bss_retain在该区域。存储器区域不需要是物理设备。这是确定的,渴望一个物理设备到单独的分区。如果您需要放置代码,那么LMA/VMA将是一个问题。顺便说一下,我认为问题是VMA,而不是LMA(但我认为VMA是你的意思)。“加载地址”仅对初始引导有影响,初始引导可能会复制“初始化数据”(以及在某些情况下要重新定位的代码)。

r6hnlfcb

r6hnlfcb2#

我和我的队友讨论了这个奇怪的场景,我们找到了一个解决方案,尽管我们不能确切地弄清楚为什么这样做是有效的:x1c 0d1x的数据
似乎我们需要重新计算SIZEOF(.bss_retain)后定义的节时,链接器可能知道确切的真实的大小。但仍然令人困惑的是,为什么以前的解决方案不起作用。
1.如果在定义节之前计算大小是无效的,为什么位置计数器的值是“”。= 0x 22000- SIZEOF(.bss_retain)”是否正确,链接是否成功?
1.如果它是有效的,为什么VMA是SRAM(0x 22000)的结尾?

相关问题