gcc - “–print-memory-usage” 在 GCC 中工作吗?

标签 gcc linker

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,...

  • 堆使用:mallocnew 等。

编译器可以为您做的事情是-fstack-usage和类似的事情,它为每个翻译单元生成一个文本文件*.su。编译器报告编译时已知的堆栈使用情况(静态)和运行时出现的未知堆栈使用情况(动态)。标记为static的函数使用指定数量的堆栈空间,不计算非内联被调用者的使用情况。

为了了解完整的堆栈使用情况(或可靠的上限),必须了解动态调用图。即使已知,GCC 也不会为您做分析。您将需要其他更复杂的工具来计算这些指标,例如通过 abstract interpretation或其他静态分析方法。

请注意,运行时收集的数据(例如运行时的动态堆栈使用分析)仅提供内存使用(或执行时间)的下限。然而,对于像安全关键应用程序这样的声音分析,您需要的是上限

关于gcc - “–print-memory-usage” 在 GCC 中工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75359853/

相关文章:

c - 使用 GCC 逐步进行 C 编译?

c - gentoo ld.gold 在 sys-libs/db 上失败

c++ - 从 Swift 调用 C++ 函数

c++ - 当 extern 声明和定义之间存在不匹配的类型时会出现什么行为?

c - 如何获得 C 程序的优化 RTL?

c - 即使设置 PATH 变量后也是 "gcc is not recognized"。剩下什么?

c - 使用 execvp 传递参数

visual-studio - Rust 代码无法链接到在 Windows 上编译的 C 库,因为存在未解析的外部符号

linker - 如何将目标文件链接到 UEFI DXE/EFI 驱动程序?

c - gcc 的缓冲区溢出示例