gpt4 book ai didi

linker - GNU LD 填充未使用的空间

转载 作者:行者123 更新时间:2023-12-05 07:41:22 28 4
gpt4 key购买 nike

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

最佳答案

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

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

对于您的第二个示例,没有明确的“发出”命令。 FILL 只有在知道要填充多少时才会生效:没有发射,没有填充。

您需要告诉您的代码使用 __attribute__((__section__(".my_test")) 将一些代码或数据放入您的 .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

关于linker - GNU LD 填充未使用的空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45348540/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com