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