Linux——size命令查看二进制文件各个数据段

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:存放了未初始化的全局/静态变量

以上都是编译过程中就已经确定了内存空间的,栈和堆的数据都是在运行时动态分配的,所以没办法在二进制文件中显式大小。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值