文本段、数据段、bss段
来源:互联网 发布:java获取网页源代码 编辑:程序博客网 时间:2024/06/10 11:57
1. a.out
有使用过linux的都知道,在linux下编译链接程序,如果不加-o参数,所有的输出文件都默认使用同一个名字a.out。a.out是"assembler output"的缩写格式,代表汇编程序输出。在较早版本的类unix系统中,a.out是一种输出格式,用于可执行文件,但到PDP-11之后,人们为其编写了链接器,程序的创建是先编译然后链接输出保存到a.out中,这时a.out其实已经是链接输出了,但输出的可执行文件仍然延续这个命名习惯。因为构建a.out的复杂性,a.out格式被现在普遍使用的ELF(Executable and Linking Format)格式所替代,但输出文件名仍旧是a.out,现在我们看到的a.out只是一个可执行文件,而不再是文件格式。
2.段
不管是a.out格式、ELF格式还是COFF格式,所有这些不同格式具有共同的概念,那就是段(segments),在UNIX中,段表示一个二进制文件相关的内容块。一个可执行文件有三个段:文本段(代码段)、数据段、bss段(Block Started by Symbol),可用size的命令查看段的大小。
text指的是程序指令
data指的是所有的经过初始化后的全局变量和静态变量
bss段则是未经初始化的全局变量和静态变量,但是bss段不增加目标文件的大小,一般只是记录bss段的大小。
例子1#f1.c:
int main(){ printf("hello word!\n"); return 0;}
结果:
$ gcc -o f1 f1.c$ ls -l f1 -rwxrwxr-x. 1 xjx xjx 4680 3月 24 11:45 f1$ size f1text data bss filename1035 252 8 f1
分析:目标文件4680字节,text段1035字节、data段252字节、bss段8字节大小
说明:
(1) bss段不保存在目标文件中,除了记录bss段在运行时的大小
例子2#f2.c:
#include<stdio.h>int a[1000];//全局数组int main(){ printf("hello word!\n"); return 0;}
结果:
$ gcc -o f2 f2.c$ ls -l f2-rwxrwxr-x. 1 xjx xjx 4698 3月 24 12:01 f2$ size f2 text data bssfilename 1035 252 4032 f2
分析:
目标文件4698字节,相对f1未明显增加,text段1035字节、data段252字节、bss段4032字节大小。可以推出未初始化的全局变量数组a,存在于bss段,且不增加目标文件的大小
(2) data段保存在目标文件中
结果:#include<stdio.h>int a[1000]={1};//初始化全局变量int main(){ printf("hello word!\n"); return 0;}
分析:$ gcc -o f3 f3.c$ ls -l f3-rwxrwxr-x. 1 xjx xjx 8734 3月 24 12:07 f3$ size f3 text data bss filename 1035 4280 8 f3
目标文件8734字节,相对f2文件明显变大;text段1035字节、data段4280字节,明显变大;bss段8字节大小。可以推出初始化后使得数组从bss段转换到data段,从而使目标文件变大。
(3)局部变量不在可执行文件中
例子4#f4.c:
#include<stdio.h>int a[1000]={1};int main(){ int b[1000],c[1000]={1};//局部变量 printf("hello word!\n"); return 0;}
结果:
分析:$ gcc -o f4 f4.c$ ls -l f4-rwxrwxr-x. 1 xjx xjx 8798 3月 24 12:14 f4$ size f4 text data bss filename 1083 4280 8 f4
目标文件8798字节,相对f3文件无明显变化;text段1083字节、data段4280字节、bss段8字节大小。可以推出局部变量不进入目标文件,运行时创建。
- 文本段、数据段、bss段
- bss段和数据段
- BSS段 数据段 代码段 堆栈
- BSS段、数据段和代码段
- BSS段、数据段和代码段
- BSS段、数据段、代码段
- 代码段,数据段和bss段
- 数据段,代码段,bss段
- 详解可执行程序:BSS段、数据段、代码段(也称文本段)
- 数据段、代码段、堆栈段、BSS段的区别
- 数据段、代码段、堆栈段、BSS段的区别
- 数据段、代码段、堆栈段、BSS段的区别
- 数据段、代码段、堆栈段、BSS段的区别
- 数据段、代码段、堆栈段、BSS段的区别
- 数据段、代码段、堆栈段、BSS段的区别
- 数据段、代码段、堆栈段、BSS段的区别
- 数据段、代码段、堆栈段、BSS段的区别
- 数据段、代码段、堆栈段、BSS段的区别
- 工厂模式和单例模式---小笔记
- 设计模式之组合模式
- 扁平化设计五大原则
- 我们都是好孩子
- 杨氏矩阵搜索算法
- 文本段、数据段、bss段
- redis 多数据库
- 移动广告聚合平台经验分享:芒果、果合、Adview、抓猫哪家好?
- Linux 下网络性能优化方法简析
- 正整数正则表达式
- process monitor
- win7下安装rational rose2003(2007可行)java.lang.ClassNotFoundException错误的解决方法
- 【嵌入式开发】C语言 结构体相关 的 函数 指针 数组
- 调用国家气象局天气接口