GNU LD填充未使用的空间

问题描述 投票:2回答:1

我试图了解GNU链接器的行为以及如何处理节。

我正在编辑stm32_flash.ld中的this stm32 project文件。

当我修改链接描述文件以将以下内容作为第一部分时:

.my_test :
{
    . = ALIGN(4);
    KEEP(*(.my_test))
    LONG(0xdeadbeef);
    . = ALIGN(4);
} >FLASH

正如我所期望的,我可以看到生成的二进制文件的第一个字节为0xdeadbeef

$ od -An -tx1 -w1 -v build/program.bin | head
ef
be
ad
de
00
a0
00
20
31
5e

但是,如果我将以下内容用作第一部分:

.my_test :
{
        . = ALIGN(8);
        KEEP(*(.my_test))
        FILL(0xDEADBEEF)
        . = 0x8000;
} > FLASH

然后看起来链接程序完全跳过了本节:

$ od -An -tx1 -w1 -v build/program.bin | head
00
a0
00
20
2d
de
00
08
c1
d9

但是我希望前0x8000个字节充满0xdeadbeef。链接器为什么忽略我的部分?

linker ld
1个回答
0
投票

您的任何代码是否“散发”到.my_test部分?

在您的第一个示例中,有一个命令使用LONG命令将四个字节“发射”到该部分。

在第二个示例中,没有明确的“发射”命令。 FILL仅在知道有多少要填充时才生效:什么都没有散发,什么也没有填充。

[您需要告诉您的代码使用.my_test将一些代码或数据放入__attribute__((__section__(".my_test"))部分,或者只需再次使用LONG编辑第二个示例:

.my_test :
{
    . = ALIGN(8);
    KEEP(*(.my_test))
    FILL(0xDEADBEEF)
    . = 0x7FFC;      /* Note shorter to accommodate following LONG */
    LONG(0xBEEFDEAD) /* Deliberately reversed to demonstrate the result */
} > FLASH
© www.soinside.com 2019 - 2024. All rights reserved.