GCC中“-print-memory-usage”的工作情况如何?

mu0hgdu0  于 2023-02-08  发布在  其他
关注(0)|答案(1)|浏览(380)

GCC如何使用--print-memory-usage提供链接器文件中定义的每个内存区域中使用的内存的明细?

gudnpqoy

gudnpqoy1#

GCC只是将--print-memory-usage转发给链接器,通常是ld
https://sourceware.org/binutils/docs-2.40/ld.html#index-memory-usage
gcc(或g++)不知道内存使用情况,链接器只能报告静态存储内存的使用情况,通常为:

    • .text**:要执行的"程序"或代码。可能位于RAM或ROM(例如闪存)中,具体取决于选项和体系结构。
    • .rodata**:静态存储器中的只读数据,运行时不需要初始化。通常位于非易失性存储器中,如ROM或闪存;但也有例外,其中之一是avr-gcc
    • .data.bss**和通用:RAM中在启动期间由CRT初始化的数据(C运行时)。

除了这些常见设置外,可能还有其他部分,如.init*.boot.jumptables等,这也取决于应用程序和体系结构。
就其本质而言,链接器(或汇编器或编译器)无法确定在运行时展开的内存使用情况,即:

      • 堆栈使用情况**:不能保存在寄存器中的非静态局部变量,alloca,...
      • 堆使用率**:mallocnew和朋友们。

编译器可以为你做的是-fstack-usage和类似的事情,它为每个翻译单元生成一个文本文件*.su。(static)和运行时出现的未知堆栈使用情况(dynamic)。标记为static的函数使用指定的堆栈空间量,但不计算非内联被调用方的使用量。
为了了解完整的堆栈使用情况(或者可靠的上限),动态调用图必须是已知的。即使它是已知的,GCC也不会对你进行分析。你将需要其他更精细的工具来计算这些指标,例如通过abstract interpretation或其他静态分析方法。
请注意,在运行时收集的数据,如运行时的动态堆栈使用分析,只提供内存使用(或执行时间)的 * 下限 *。然而,对于安全科学应用程序中的声音分析,您需要的是 * 上限 *。

相关问题