栈上分配不同大小数组为何生成的ELF文件尺寸一致?[C语言]
问题解答
栈上声明的局部数组不会影响ELF文件的大小,核心原因是这类内存是程序运行时动态分配的,和ELF文件的静态存储空间完全无关,具体拆解如下:
- 栈内存的分配逻辑:程序启动后,操作系统会为进程分配一块固定大小的栈空间(Linux默认通常是8MB)。当函数执行时,局部变量(包括你声明的
big数组)是通过移动栈指针(比如x86_64架构的%rsp寄存器)来临时“预留”空间,整个过程只在运行时发生,不会在ELF文件里提前占用存储空间。 - ELF文件的存储范围:ELF文件只保存程序的静态内容——比如代码段(
.text,存编译后的指令)、数据段(.data,存已初始化的全局/静态变量)、BSS段(.bss,存未初始化的全局/静态变量,仅占符号表空间,不占文件实际字节)。栈上的局部变量不属于这些段,所以无论数组多大,都不会让ELF文件变大。 - 你的案例验证:Prog.A和Prog.B的代码逻辑几乎完全一致——都是计算
sizeof(big)并打印,编译后的指令没有本质差异,自然ELF文件的大小和结束地址完全相同。甚至如果big[100000000]的大小超过了栈的默认限制,程序运行时会直接触发栈溢出崩溃,但ELF文件本身还是不会有任何变化。
如果把数组改成全局变量,情况就完全不同了:
// 这个程序编译后的ELF文件会明显变大 int big[100000000]; int main() { printf("%zu\n", sizeof(big)); return 0; }
因为全局数组属于静态分配,会被放在ELF的.bss段(未初始化),如果是初始化的全局数组会放在.data段,直接增大ELF文件的大小。
内容的提问来源于stack exchange,提问作者maor36a
相关产品推荐
相关产品推荐

