目标文件ELF(Executable Linkable Format)
可执行文件:主流上有两种,PE 和 ELF 。目标文件就是.o文件,它和可执行文件有相似几乎相同的文件结构,所以我们可以将他们两个看成是一种类型的文件,其实库文件就是.o文件,这足以说明它和可执行文件的关系。
ELF文件类型 说明 示例
可重定位文件 主要包含代码和数据,静态库也可以包含到这一类。 linux ->.o windos->.obj
可执行文件 就是可执行文件,没有扩展名 /bin/bash 文件 exe文件
共享目标文件 连接器可以使用,动态链接库的实现 linux->.so 文件 DLL
核心转储文件 当进程终止时可以将进程的地址空间内容等信息转移到核心转储文件 core dump
目标文件的结构:
目标文件中一般以段 或者 节来存放信息。大体上由四个部分。
头文件部分,文本段,数据段,BSS段,只读数据段,注释信息段,堆栈段。
现在来逐一解析这些段:
头文件:
目标文件的头文件包含有,系统平台信息,硬件信息,环境信息,函数的借口入口等最重要的时还包含一个名叫“段表”的东西。段表记录了目标文件中的各个段信息。
text , rel.text , data, bss , rodata ,comment , not-GNU-stack,shstrtab ,symtab,strtab 这些段信息。
可以通过readelf -S XXX.o 来查看这些东西。
文本段:
就是存放代码的段,一般以ASCII的形式来存放代码,使用gcc -s XXX.o 可以反汇编代码。
数据段:
存放已经声明并且初始化过的数据,全局静态变量,局部静态变量,函数内的数据不会在这里边,一般在函数运行时才会生成在函数栈上。全局变量未初始化
或者初始化为0,则不再数据段中。
BSS段:
存放未初始化的全局静态变量和局部静态变量,同时未初始化的全局变量也不会在BSS段存放而是作为一种符号的存在,被放在符号表中。
comment(注释表):
用来存放我们所写的注释。
堆栈段:
提示这个可执行文件的堆栈,一般来说堆栈应该是可重入的,
其他段:
debug 调试信息,dynamic 动态链接信息,HASH 哈希表,line调试的行号表还有符号表等等。