GNU LD填充未使用的空间

时间:2017-07-27 10:45:38

标签: linker ld

我试图了解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填充。为什么链接器会忽略我的部分?

1 个答案:

答案 0 :(得分: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