在Linux下,编译出来的目标文件具体是什么呢?可以大致的思考下,目标文件里肯定有程序编译后的指令代码,数据.没错,除了这些内容以外,目标文件还包括了链接时所需要的一些信息,比如符号表,调试信息,字符串等等.一般目标文件将这些信息按不同的属性,以"节"的形式存储,有时候也叫"段(Segment)",在一般情况下,他们都表示一个一定长度的区域,基本上不加以区别,唯一的区别是在ELF的链接视图和装载视图的时候.
程序源代码编译后的机器指令经常被放在代码段(Code Section)里,代码段最常见的名字有".code"或者".text";全局变量和局部静态变量数据经常放在数据段(Data Section),数据段一般叫做".data".下面是一个简单的程序编译后目标文件里的各个段的结构图:
对照上图来看,一般C语言编译后执行语句都被编译成机器代码,保存在.text端;已初始化的全局变量和局部静态变量都保存在.data段;未初始化的全局变量和局部静态变量一般放在一个叫做.bss的段里.我们知道未初始化的全局变量和局部静态变量默认值都是为0的,本来它们也可以放到.data段的,但是因为他们都是0,所以放到.data段分配空间并且存放为0没有必要.程序运行的时候,它们的确是要占内存空间的,并且可执行文件必须记录所有未初始化的全局变量和局部静态变量的大小综合,记为.bss段.所以.bss段只是为未初始化的全局变量和局部静态变量预留位置而已,它并没有内容,所以他在文件中也不占据空间.
参考<程序员的自我修养-链接,装载与库>
文章的脚注信息由WordPress的wp-posturl插件自动生成