如何从 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
中添加 printf
s。
对于检查使用了多少内存的特定用例,最好使用 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%
我有相当大的 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
中添加 printf
s。
对于检查使用了多少内存的特定用例,最好使用 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%