如何从 GNU ld 脚本将消息打印到标准输出?

How to print message to stdout from GNU ld script?

我有相当大的 ld link 嵌入式平台脚本,它的 RAM 和 ROM 不足。我想知道在我重新定位所有代码后还有多少可用内存。实际上,我想打印出价值 位置计数器 . 到标准输出。 我该怎么做?有没有像print(.)这样的神奇命令?

阅读manual。没有这样的命令 - 不可能。

链接器 "scripts" 实际上更像是 configuration/descriptor 文件。它们不像脚本那样 "executed"。也没有一个 .(不同的内存区域怎么可能?)。

但是,您可以输出一个 map,这可能正是您所需要的。尝试选项 -M。如果您在链接描述文件中正确设置了内存区域,如果某些内存区域溢出,链接器将发出警告,这实际上是您想要的自动构建。


更新:如果你想坚持看到每个构建的部分大小,你可以grep/filter地图文件。

我在我的项目中有一个 post-link 步骤可以转储大小,这样我就可以看到我有多接近。只需添加以下内容:

arm-none-eabi-size binary_image.axf

这将使您得到如下输出:

   text    data     bss     dec     hex filename
 204808     704   23188  228700   37d5c Foo.axf

在我的 cortex-m3 芯片上,这将是 text+data = flash 使用,data+bss = ram 使用。 dec/hex 是无用的值。

正如 Olaf 所说,使用映射文件来获取更具体的内存消耗。我已将此添加到我的 link 步骤:

-Xlinker -Map=Foo.map

您无法在脚本执行时打印符号的值,但您可以创建符号并在之后使用 nm 查找它。像这样:

value_of_dot = .;

然后

nm my_file.elf | grep value_of_dot

编辑:如果您真的想将它打印到 stdout,则必须修改链接器。例如。对于 lld,在 LinkerScript::assignSymbol() 中的 LinkerScript.cpp 中添加 printfs。

对于检查使用了多少内存的特定用例,最好使用 size,如 escrafford 所建议的,或 objdump -section-headers.

另一种解决方案可能是将以下命令添加到链接器:

-Xlinker --print-memory-usage

这给了我以下输出:

Memory region Used Size Region Size %age Used m_interrupts: 576 B 576 B 100.00% m_text: 22988 B 32192 B 71.41% m_data: 26552 B 32 KB 81.03%