链接器脚本 \- 在内存区域的末尾放置一个节

新手上路,请多包涵

我已经广泛搜索了如何做到这一点,但未能找到答案。

我的内存布局如下:

 Fake Address | Section
     0       |  text
     7       |  relocate
    15       |  bss
    23       |  stack

在堆栈的末尾,我放置了堆。它长大了,堆栈是我正在使用的 ARM 芯片的完整降序堆栈。

现在,我想做的是放置一个单独的部分,我们称之为 .persist ,放入我的内存中。我希望它位于 RAM 的最末端,并且我想将它编程到我的链接器脚本中。但是,这个 .persist 部分的大小不是由我定义的,而是由编译器根据它包含的符号计算的。

到目前为止,我还没有想出一个好的方法来做到这一点。因为我知道 RAM 起始地址和 SIZE,所以如果我知道部分大小,计算部分需要去的位置将是微不足道的。但是,根据 GNU 链接器文档(第 74 页) ,似乎:

SIZEOF(section) 返回指定节的大小(如果已分配该节)。如果在评估时该节尚未分配,则链接器将报告错误。

所以我无法计算出链接描述文件中部分的大小(因为我想在放置/分配它之前计算它的大小)。

有谁知道这样做的好方法?

原文由 nonsensickle 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 487
1 个回答

通过链接一个两步过程,我能够完成类似的事情。首先,我将相关部分编译为它自己的目标文件。就我而言,我有一个从程序集文件生成的元数据部分。 gcc -c 将源代码编译成目标文件,但不链接它们。

 gcc -c  metadata.s  -o metadata.o

您还可以构建整个程序,然后使用 objcopy 仅提取有问题的部分。

 gcc -c  main.cc  -o main.o
objcopy --only-section=.metadata  main.o  metadata.o

现在我构建并链接程序的其余部分,并将目标文件包含在链接器的输入中。

 gcc metadata.o  ../main.o  -o Program.elf  -T linkerscript.ld

链接器从目标文件中读取 .metadata 部分,我可以在链接器脚本中引用它的大小。

原文由 Fletcher D 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题