我已经广泛搜索了如何做到这一点,但未能找到答案。
我的内存布局如下:
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 许可协议
通过链接一个两步过程,我能够完成类似的事情。首先,我将相关部分编译为它自己的目标文件。就我而言,我有一个从程序集文件生成的元数据部分。
gcc -c
将源代码编译成目标文件,但不链接它们。您还可以构建整个程序,然后使用
objcopy
仅提取有问题的部分。现在我构建并链接程序的其余部分,并将目标文件包含在链接器的输入中。
链接器从目标文件中读取
.metadata
部分,我可以在链接器脚本中引用它的大小。