GCC 如何使用 --print-memory-usage 提供链接器文件中定义的每个内存区域中使用的内存的详细信息?
最佳答案
GCC 只是将 --print-memory-usage
转发给链接器,通常是 ld
:
https://sourceware.org/binutils/docs-2.40/ld.html#index-memory-usage
gcc
(或 g++
)不知道内存使用情况,链接器只能报告静态存储内存的使用情况,通常是:
.text
:要执行的“程序”或代码。它可能位于 RAM 或 ROM(例如闪存)中,具体取决于选项和架构。
.rodata
:静态存储中的数据,只读,运行时不需要初始化。它通常位于非 volatile 存储器中,例如 ROM 或闪存;但也有异常(exception),其中之一是 avr-gcc
。
.data
、.bss
和 COMMON:RAM 中的数据,在启动期间由CRT(C 运行时)。
除了这些常见的设置之外,可能还有其他部分,例如 .init*
、.boot
、.jumptables
等,这些部分又取决于关于应用程序和架构。
就其本质而言,链接器(或汇编器或编译器)无法确定运行时展开的内存使用情况,即:
堆栈使用:不能保存在寄存器中的非静态局部变量,
alloca
,...堆使用:
malloc
、new
等。
编译器可以为您做的事情是-fstack-usage
和类似的事情,它为每个翻译单元生成一个文本文件*.su
。编译器报告编译时已知的堆栈使用情况(静态
)和运行时出现的未知堆栈使用情况(动态
)。标记为static
的函数使用指定数量的堆栈空间,不计算非内联被调用者的使用情况。
为了了解完整的堆栈使用情况(或可靠的上限),必须了解动态调用图。即使已知,GCC 也不会为您做分析。您将需要其他更复杂的工具来计算这些指标,例如通过 abstract interpretation或其他静态分析方法。
请注意,运行时收集的数据(例如运行时的动态堆栈使用分析)仅提供内存使用(或执行时间)的下限。然而,对于像安全关键应用程序这样的声音分析,您需要的是上限。
关于gcc - “–print-memory-usage” 在 GCC 中工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75359853/