Unix系统中size命令为何未展示可执行及目标文件的堆、栈段?
为什么Unix的size命令不显示heap和stack段的大小?
先看你给出的size命令输出示例:
$ size hello_world-1 hello_world-1.o text data bss dec hex filename 916 256 4 1176 498 hello_world-1 48 0 0 48 30 hello_world-1.o
要搞懂为什么size不列出heap和stack,得先弄明白两个核心点:size的统计范围,以及heap/stack和text/data/bss的本质区别。
首先,size只统计磁盘文件里的静态固定段
size命令的作用是读取可执行文件或目标文件的ELF(Executable and Linkable Format)头信息,统计那些在编译链接阶段就已经确定大小、并且在磁盘上有对应存储(或明确大小记录)的段:
- text段:存放程序的机器指令代码,编译完成后大小就固定了,磁盘上直接存储这些指令;
- data段:存放已经初始化的全局变量、静态变量,它们的初始值在编译时就确定,磁盘上会占用对应空间;
- bss段:存放未初始化的全局变量、静态变量,编译时只记录它需要的内存大小,磁盘上不占空间,但程序加载时系统会为它分配内存。
这些段的信息都写在二进制文件的ELF头里,size可以直接读取计算。
而heap和stack是运行时才动态存在的内存区域
heap和stack完全是程序运行起来之后由操作系统分配的动态内存,在磁盘上的可执行文件里根本没有对应的段信息:
- stack:用于存储函数调用栈帧、局部变量等,它的初始大小由操作系统默认设定(比如Linux下可以用
ulimit -s查看默认栈大小),运行时会根据函数调用深度动态增长(有上限),磁盘文件里不会记录这个段的信息; - heap:用于动态内存分配(比如
malloc、new这类操作),它的大小完全是程序运行过程中根据需求向系统申请的,启动时只有一个初始预留空间,后续可以动态扩展,同样不会在磁盘的可执行文件里留下固定大小的记录。
简单来说,size只负责统计“磁盘上的文件里已经有的东西”,而heap和stack是程序跑起来之后才生成的“临时内存区域”,不属于磁盘文件的一部分,自然不会出现在size的输出里。
内容的提问来源于stack exchange,提问作者Kamal Pandey
相关产品推荐
相关产品推荐

