如何从GNU ld脚本向stdout打印消息?

时间:2015-07-09 14:20:02

标签: linker embedded ld

我有一个非常大的ld嵌入式平台链接脚本,RAM和ROM都很低。我想知道在重新定位所有代码后剩余多少内存。实际上,我想打印出价值 位置计数器.到标准输出。 我该怎么做?是否有像print(.)这样的神奇命令?

4 个答案:

答案 0 :(得分:2)

我的项目中有一个后链接步骤,它会转移大小的东西,所以我可以看到我有多接近。只需添加以下内容:

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 usage,data + bss = ram usage。 dec / hex是无用的值。

正如Olaf所说,使用地图文件来获取更具体的内存消耗。我将此添加到我的链接步骤:

-Xlinker -Map=Foo.map

答案 1 :(得分:1)

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

链接器“脚本”实际上更像是配置/描述符文件。它们不像脚本那样“执行”。也没有一个.(如何针对不同的内存区域?)。

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

更新:如果您想坚持查看每个版本的部分大小,可以grep /过滤地图文件。

答案 2 :(得分:0)

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

value_of_dot = .;

然后

nm my_file.elf | grep value_of_dot

编辑:如果你真的希望它打印到stdout,你必须修改链接器。例如。对于lld,请在printf的{​​{1}}中添加LinkerScript.cpp

对于检查使用了多少内存的特定用例,最好使用LinkerScript::assignSymbol(),如escrafford建议的那样,或size

答案 3 :(得分:0)

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

-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%