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

bra*_*ray 11 c embedded

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

don*_*don 10

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

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

-Wl,-Map = output.map


Bro*_*ses 8

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

   text    data     bss     dec     hex filename
 332268    2200   19376  353844   56634 test-directory/add
Run Code Online (Sandbox Code Playgroud)

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

因此,我认为你最终得到的"数据"和"bss"的总和基本上就是你想要的.(看完hlovdal链接的文章后,我对此不太确定;或许评论者可以添加确认吗?)

(之后,"dec"和"hex"是十进制和十六进制的所有内容的总大小,"文件名"当然是显而易见的.)