Linux中size命令,列出elf文件中text,data,bss段的大小。
先放一张,Linux系统中C程序的虚拟内存分布图,来自《深入理解计算机系统(第3版)》:
其中.data数据段存放的是初始化的全局和静态变量(全局或局部静态),.bss存放的是未初始化的全局和静态变量(全局或局部静态)。
起始大小:
我们先写最简单的例子看一下一开始各段的大小,再进行对比:
int main() {
return 0;
}
size program结果:
text data bss dec hex filename
1172 584 8 1764 6e4 program
全局初始化变量
int global_val = 1;
int main() {
return 0;
}
size program结果:
text data bss dec hex filename
1172 588 4 1764 6e4 program
从结果上看全局初始化变量是存放在.data数据段。
全局未初始化变量
int global_val;
int main() {
return 0;
}
size program 结果:
text data bss dec hex filename
1172 584 8 1764 6e4 program
全局未初始化变量存放在bss段。且被默认初始化为0。
初始化静态变量
static int global_val = 1;
int main() {
static int local_val = 2;
return 0;
}
size program结果:
text data bss dec hex filename
1172 592 8 1772 6ec program
全局/局部初始化静态变量都存放在data数据段。
未初始化静态变量
static int global_val;
int main() {
static int local_val;
return 0;
}
size program结果:
text data bss dec hex filename
1172 584 16 1772 6ec program
全局/局部未初始化静态变量存放在bss段中,且被默认初始化为0。
常量
const int global_val = 1;
int main() {
return 0;
}
size program结果:
text data bss dec hex filename
1176 584 8 1768 6e8 program
常量是放在text段中,因为它是不允许被改变的,所以放在text中可以理解。
总结
1.text:存放了代码,常量,字符串常量等
2.data:存放了初始化的全局/静态变量
3.bss:存放了未初始化的全局/静态变量
以上都是编译过程中就已经确定了内存空间的,栈和堆的数据都是在运行时动态分配的,所以没办法在二进制文件中显式大小。