Linux可执行文件结构
在Linux系统下,程序是一个普通可执行文件,以下列出一个Linux下ELF格式可执行文件的基本情况
可以看出,此ELF格式可执行文件在存储时(没有调入内存)分为代码区(text)、数据区(data)和未初始化数据区(bss)3个部分。各段基本内容说明如下:
- 代码区(text segment)。存放CPU执行的机器指令(machine instructions)。通常,代码区是可共享的(即另外的执行程序可以调用它),使其可共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可。代码区通常是只读的,使其只读的原因是防止程序意外地修改了它的指令。因此,常量数据在编译时在代码段中分配空间。代码区的指令包括操作码和操作对象(或对象地址引用)。如果是立即数(即具体的数值,如5),将直接包含在代码段中;如果是局部数据,将在运行时在栈区分配空间,然后再引用该数据的地址;如果是BSS区和数据区,在代码中同样引用该数据的地址。
- 全局初始化数据区/静态数据区(initialized data segment/data segment)。或简称数据段,该区包含了在程序中明确被初始化的全局变量、已经初始化的静态变量(包括全局静态变量和局部静态变量)。但被const声明的变量以及字符串常量在代码段中申请空间。例如,一个不在任何函数体内的定义(全局数据)如下:int maxcount =99;使得变量maxcount根据其初始值被存储到初始化数据区中。在任意位置定义静态变量的方式如下:static mincount=100;这定义了一个静态变量并初始化,如果是在任何函数体外定义,则表示其为一个全局静态变量,如果在函数体内(局部),则表示其为一个局部静态变量。需要提及的是,如果在函数名前加上static,则表示此函数只能在当前文件中被调用。
- 未初始化数据区。亦称BSS(Block Started by Symbol),存入的是未初始化全局变量和未初始化静态变量。BSS区的数据在程序开始执行之前被内核初始化为0或者空指针(NULL)。例如一个在函数体外定义,未初始化变量:long sum[1000];//将变量sum存储到未初始化数据区
另:局部变量动态地在栈中申请。
代码段地数据增加了15个字节,分别是4字节的const i 和11个字节的字符串“helloworld”。
来源:《Linux高级程序设计》人民邮电出版社 杨宗徳 吕光宏 刘雍 编著