如何衡量全局变量的总大小?

时间:2010-02-25 23:59:36

标签: c embedded

我正在创建一个c程序,我打算在近期内在ARM处理器上运行。我想用我的全局变量测量我正在使用的内存量,同时忽略堆栈/堆的大小。有没有办法让gcc在编译时将其转储出来或从编译的二进制文件中检索这些信息?

3 个答案:

答案 0 :(得分:10)

了解内存的最佳方法是查看链接器映射。链接器映射是由链接器生成的文件,并详细说明程序的所有内存位置。您可以在全局变量和代码的基础上逐个符号地查看内存分配。我过去曾使用链接器映射来处理内存要求严格的项目。它们可以很容易地识别出占用大量空间的全局内存缓冲区等问题区域。

将此选项添加到gcc命令行以生成链接器映射:

-Wl,-Map = output.map

答案 1 :(得分:8)

GNU binutils套件包含一个名为“size”的程序,这是获取所需数据的最简单方法 - 或者至少是一个合理的近似值。对于典型的程序(在这种情况下,不是一个小的嵌入式程序),输出可能如下所示:

   text    data     bss     dec     hex filename
 332268    2200   19376  353844   56634 test-directory/add

前三列是二进制中各节的大小:“text”是可执行代码,“data”是常量等等 - 包括用显式初始化器表示初始变量的那些 - 而“bss”是用于隐式静态初始化的所有内容的初始化程序。在典型的嵌入式程序中,那些静态初始化程序几乎专门用于全局变量(并且,出于您的目的,您可能希望在测量中包含其他静态变量,因为它们也不在堆栈或堆中)。 / p>

因此,我认为你最终得到的“数据”和“bss”的总和基本上就是你想要的。 (看完与hlovdal相关的文章后,我对此不太确定;也许评论者可以加上确认吗?)

(之后,“dec”和“hex”是十进制和十六进制的所有内容的总大小,“filename”当然是显而易见的。)

答案 2 :(得分:2)

您需要使用objdump分析不同的内存段。有关文章,请参阅here;有关此问题的详细信息,请参见here