GCC如何使用--print-memory-usage提供链接器文件中定义的每个内存区域中使用的内存的明细?
gudnpqoy1#
GCC只是将--print-memory-usage转发给链接器,通常是ld:https://sourceware.org/binutils/docs-2.40/ld.html#index-memory-usagegcc(或g++)不知道内存使用情况,链接器只能报告静态存储内存的使用情况,通常为:
--print-memory-usage
ld
gcc
g++
.text
.rodata
avr-gcc
.data
.bss
除了这些常见设置外,可能还有其他部分,如.init*、.boot、.jumptables等,这也取决于应用程序和体系结构。就其本质而言,链接器(或汇编器或编译器)无法确定在运行时展开的内存使用情况,即:
.init*
.boot
.jumptables
alloca
malloc
new
编译器可以为你做的是-fstack-usage和类似的事情,它为每个翻译单元生成一个文本文件*.su。(static)和运行时出现的未知堆栈使用情况(dynamic)。标记为static的函数使用指定的堆栈空间量,但不计算非内联被调用方的使用量。为了了解完整的堆栈使用情况(或者可靠的上限),动态调用图必须是已知的。即使它是已知的,GCC也不会对你进行分析。你将需要其他更精细的工具来计算这些指标,例如通过abstract interpretation或其他静态分析方法。请注意,在运行时收集的数据,如运行时的动态堆栈使用分析,只提供内存使用(或执行时间)的 * 下限 *。然而,对于安全科学应用程序中的声音分析,您需要的是 * 上限 *。
-fstack-usage
*.su
static
dynamic
1条答案
按热度按时间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
,...malloc
,new
和朋友们。编译器可以为你做的是
-fstack-usage
和类似的事情,它为每个翻译单元生成一个文本文件*.su
。(static
)和运行时出现的未知堆栈使用情况(dynamic
)。标记为static
的函数使用指定的堆栈空间量,但不计算非内联被调用方的使用量。为了了解完整的堆栈使用情况(或者可靠的上限),动态调用图必须是已知的。即使它是已知的,GCC也不会对你进行分析。你将需要其他更精细的工具来计算这些指标,例如通过abstract interpretation或其他静态分析方法。
请注意,在运行时收集的数据,如运行时的动态堆栈使用分析,只提供内存使用(或执行时间)的 * 下限 *。然而,对于安全科学应用程序中的声音分析,您需要的是 * 上限 *。