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

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

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux中,可以使用xxd命令查看二进制文件。xxd命令是用于将文件转换成十六进制或反向操作的工具。通过xxd命令,我们可以查看二进制文件的内容和结构。 另外,还可以使用hexdump命令查看二进制文件hexdump是一个十六进制转储工具,可以将文件以十六进制和ASCII字符的形式显示出来,从而更好地理解二进制文件的内容。 如果你想要在Linux中生成和读取二进制文件,可以使用C或C++编程语言。通过在程序中使用文件操作函数,如fopen、fread、fwrite等,可以实现对二进制文件的读取和写入操作。例如,你可以使用main2.cpp来生成一个二进制文件,然后使用main3.c来读取该二进制文件。在读取二进制文件时,可以使用fgets函数来读取指定长度的字符串,用于读取格式化固定位址的二进制结构数据。 综上所述,在Linux中,可以使用xxd命令hexdump命令查看二进制文件的内容和结构。如果需要生成和读取二进制文件,则可以使用C或C++编程语言来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Linux查看二进制文件](https://blog.csdn.net/qq_19922839/article/details/115483499)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [linux c 读写二进制文件](https://download.csdn.net/download/sunflow/85483138)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值