【发布时间】:2010-02-25 23:59:35
【问题描述】:
我正在创建一个 c 程序,我打算在不久的时间内在 ARM 处理器上运行。我想测量我与全局变量一起使用的内存量,同时忽略堆栈/堆的大小。有没有办法让 gcc 在编译时将其转储出来或从已编译的二进制文件中检索此信息?
【问题讨论】:
我正在创建一个 c 程序,我打算在不久的时间内在 ARM 处理器上运行。我想测量我与全局变量一起使用的内存量,同时忽略堆栈/堆的大小。有没有办法让 gcc 在编译时将其转储出来或从已编译的二进制文件中检索此信息?
【问题讨论】:
查看内存去向的一个好方法是查看链接器映射。链接器映射是由链接器生成的文件,详细说明了程序的所有内存位置。您可以逐个符号地查看全局变量和代码的内存分配。我过去曾将链接器映射用于内存需求紧张的项目。它们可以轻松识别问题区域,例如占用大量空间的全局内存缓冲区。
将此选项添加到 gcc 命令行以生成链接器映射:
-Wl,-Map=output.map
【讨论】:
GNU binutils 套件包含一个名为“size”的程序,它是获取所需数据的最简单方法——或者至少是一个合理的近似值。对于典型的程序(在这种情况下,不是小型嵌入式程序),输出可能如下所示:
text data bss dec hex filename
332268 2200 19376 353844 56634 test-directory/add
前三列是二进制文件中各部分的大小:“text”是可执行代码,“data”是常量等等——包括那些用显式初始化器表示初始变量的——而“bss”是所有被隐式静态初始化的东西的初始化器。在典型的嵌入式程序中,这些静态初始化器几乎专门用于全局变量(并且,出于您的目的,您可能希望在测量中包含其他静态变量,因为它们也不在堆栈或堆上)。
因此,我认为您最终得到的“数据”和“bss”之和基本上就是您想要的。 (阅读 hlovdal 链接的文章后,我对此不太确定;也许评论者可以添加确认?)
(之后,“dec”和“hex”是十进制和十六进制的总大小,“filename”当然是显而易见的。)
【讨论】: