ELF

来源:互联网 发布:路由器禁止mac地址 编辑:程序博客网 时间:2024/05/16 19:01

ELF(Executable and Linkable Format):Linux系统中使用的可执行科链接格式

ELF头:和PE文件一样存着属性机器类型等信息(还包含帮助链接器语法分析和解释目标文件的类型)
EFL之后是以下的节区
.text:已编译程序的机器代码
.rodata:只读数据
.data:已初始化的全局变量或静态C变量
.bss:未初始化的全局和静态变量,以及所有被初始化为0的全局变量或静态变量(在目标文件中这个文件不占实际空间,只有在运行时内存分配这些变量,初始化为0)
.symtab:符号表,保存着程序中定义的函数和引用全局变量的信息 不包含局部变量条目
.rel.text:一个.text节中位置的列表,当链接器吧这个目标文件和其他文件组合时需要修改这些位置(一般调用任何外部函数或者引用全局变量的指令都需要修改(也就是静态链接重定位))(本地函数不需要重定位)(可执行目标文件中不需要重定位信息因此通常省略)
.rel.data:被模块引用或定义的所有全局变量的重定位信息,任何已初始化的全局变量,如果他初始值是一个全局变量的地址或者外部定义的地址都需要被重定位
.debug:一个调试符号表其条目是程序定义的局部变量和定义类型,程序中定义和引用的全局变量,只有以-g选项调用编译器驱动程序时才会的到这张表
.line:原始C程序中的行号和.text节中机器指令之间的映射。只有以-g选项调用编译器驱动程序时才会的到这张表
.strtab:一个字符串表
以上部分加上头组成了节,节后面是节头部表

符号表:
每个可重定位的目标模块m都有一个符号表,它包含m定义和使用的符号信息(变量和函数名的解释)在链接器中有三种不同符号
1. 从模块m中定义,并被其他模块引用的全局符号(非静态函数和全局变量)
2. 由其他模块定义并被模块m引用的全局符号(外部符号)
3. 只被m中定义和使用的局部符号(它们也是m中的全局变量和c函数(带有static属性))