【问题标题】:How do I measure the total size of my global variables?如何测量全局变量的总大小?
【发布时间】:2010-02-25 23:59:35
【问题描述】:

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

【问题讨论】:

    标签: c embedded


    【解决方案1】:

    查看内存去向的一个好方法是查看链接器映射。链接器映射是由链接器生成的文件,详细说明了程序的所有内存位置。您可以逐个符号地查看全局变量和代码的内存分配。我过去曾将链接器映射用于内存需求紧张的项目。它们可以轻松识别问题区域,例如占用大量空间的全局内存缓冲区。

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

    -Wl,-Map=output.map

    【讨论】:

      【解决方案2】:

      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”当然是显而易见的。)

      【讨论】:

        【解决方案3】:

        你需要用objdump分析不同的内存段。请参阅here 获取文章,here 获取另一个答案,其中提供了一些详细信息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-02-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多