【发布时间】:2015-07-09 14:20:01
【问题描述】:
我有相当大的ld 用于嵌入式平台的链接脚本,它的 RAM 和 ROM 都很低。我想知道重新定位所有代码后还剩下多少可用内存。实际上,我想打印出价值
位置计数器. 到标准输出。
我该怎么做?有没有像print(.) 这样的神奇命令?
【问题讨论】:
我有相当大的ld 用于嵌入式平台的链接脚本,它的 RAM 和 ROM 都很低。我想知道重新定位所有代码后还剩下多少可用内存。实际上,我想打印出价值
位置计数器. 到标准输出。
我该怎么做?有没有像print(.) 这样的神奇命令?
【问题讨论】:
我在我的项目中有一个链接后步骤,它可以转储内容的大小,以便我可以看到我离我有多近。只需添加以下内容:
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 所说,使用映射文件来实现更具体的内存消耗。我已将此添加到我的链接步骤中:
-Xlinker -Map=Foo.map
【讨论】:
另一种解决方案可能是将以下命令添加到链接器:
-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%
【讨论】:
阅读manual。没有这样的命令 - 不可能。
链接器“脚本”实际上更像配置/描述符文件。它们不像脚本那样“执行”。也没有一个.(怎么可能是不同的内存区域?)。
但是,您可以输出一个可能正是您需要的 map。尝试选项-M。如果您在链接描述文件中正确设置了内存区域,链接器会在某些内存区域溢出时发出警告,这实际上是您想要的自动构建。
更新:如果您想坚持查看每个构建的部分大小,可以 grep/过滤地图文件。
【讨论】:
. 是一个随着脚本“执行”而更新的变量。我不知道你为什么认为这是不可能的。
在执行脚本时您不能打印符号的值,但您可以创建一个符号并在之后使用nm 查找它。像这样:
value_of_dot = .;
然后
nm my_file.elf | grep value_of_dot
编辑:如果您真的希望将其打印到stdout,则必须修改链接器。例如。对于lld,在LinkerScript.cpp 中添加printfs 在LinkerScript::assignSymbol() 中。
对于检查内存使用量的特定用例,最好使用 size(正如 escrafford 建议的那样)或 objdump -section-headers。
【讨论】:
size 显然更适合他的应用程序。但是从 Google 提出这个问题的人可能不想做完全相同的事情。