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

Linker 如何从GNULD脚本将消息打印到标准输出?,linker,embedded,ld,Linker,Embedded,Ld,我有相当大的ld链接脚本用于嵌入式平台,它的RAM和ROM都很低。我想知道在重新定位所有代码后,还有多少内存可用。实际上,我想打印出值 位置计数器到标准输出。 我怎么做?是否有一些神奇的命令,如打印(.)?阅读。没有这样的命令——不可能有 链接器“脚本”实际上更像配置/描述符文件。它们不像脚本那样“执行”。也没有一个(对于不同的内存区域,怎么可能呢?) 但是,您可以输出一个可能正是您所需要的映射。尝试选项-M。如果您在链接器脚本中正确设置了内存区域,链接器将在某些内存区域溢出时发出警告,这实际上

我有相当大的
ld
链接脚本用于嵌入式平台,它的RAM和ROM都很低。我想知道在重新定位所有代码后,还有多少内存可用。实际上,我想打印出值 位置计数器
到标准输出。 我怎么做?是否有一些神奇的命令,如打印(.)?

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

链接器“脚本”实际上更像配置/描述符文件。它们不像脚本那样“执行”。也没有一个
(对于不同的内存区域,怎么可能呢?)

但是,您可以输出一个可能正是您所需要的映射。尝试选项
-M
。如果您在链接器脚本中正确设置了内存区域,链接器将在某些内存区域溢出时发出警告,这实际上是自动生成所需的



更新:如果您坚持要查看每个版本上的节大小,您可以对地图文件进行grep/过滤。

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

arm-none-eabi-size binary_image.axf
这将得到如下输出:

   text    data     bss     dec     hex filename
 204808     704   23188  228700   37d5c Foo.axf
在我的cortex-m3芯片上,这将是文本+数据=闪存使用,数据+bss=ram使用。dec/hex是无用的值

正如Olaf所说,使用映射文件进行更具体的内存消耗。我已将此添加到我的链接步骤中:

-Xlinker -Map=Foo.map

执行脚本时不能打印符号的值,但可以创建一个符号,然后使用
nm
进行查找。像这样:

value_of_dot = .;
然后

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


对于检查使用了多少内存的特定用例,可能最好使用Escraford建议的
size
,或者
objdump-section headers

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

-Xlinker--打印内存使用情况

这为我提供了以下输出:

已使用内存区域大小已使用区域大小%age
m_中断:576 B 576 B 100.00%
m_text:22988 B 32192 B 71.41%

m_data:26552 B 32 KB 81.03%

但我想知道我将来要写的代码有多少空间。但是,您是对的,在ld脚本中没有打印消息的命令,所以我将标记您的答案为正确。@RostakaGmfun:请再次阅读最后一段,我稍微编辑了一下。有办法!伟大的这是我真正需要的东西!感谢它们显然像脚本一样执行<代码>是在脚本“执行”时更新的变量。我不知道你为什么认为这是不可能的。@timmm仅仅因为有一个变量并不意味着它们是可执行文件。makefiles不是脚本(尽管它们甚至可以包含代码片段)。事实上,这比简单地检查映射文件更糟糕,而且它不符合OP的要求(这显然是不可能的)。如果您将它放在脚本的末尾,在所有部分之后(假设它们都按顺序排列),它会满足OP的要求使用
size
显然更适合他的应用程序。但是,谷歌提出这个问题的人可能不想做完全相同的事情。不,它没有做OP显然想要做的事情:通过链接器将这些信息输出到stdout。这正是我在回答中所写的:不可能。此外,它实际上与嵌入式开发无关。这里要做的是检查代码/数据是否适合内存区域。这就是我在回答中写到的链接器自动检查的内容。这就是OP需要的。当然,但我来问这个问题是因为我出于不同的原因想打印一个符号值,所以回答他问的问题对其他人仍然有用。请取消你的否决票。这个答案显然有效。
nm my_file.elf | grep value_of_dot