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