Executable and Linkable Format
ELF是种常用的文件格式,通常可分为:可执行文件、目标文件(可重定位文件,没有经过链接)、共享目标文件、核心转储文件;
下面对这几种文件进行说明:
- 可执行文件(Executable File):可以直接执行的程序,比如:在linux下/bin/bash文件,在windows下的.exe文件;
- 可重定位文件(Relocatable File):这类文件包含了代码和数据,可以被用来链接成可执行文件或共享目标文件,静态链接库也可归为这一类,比如:在linux下的.o文件,在windows下的.obj文件;
- 共享目标文件(Shared Object File):这类文件包含了代码和数据,链接器可以使用这种文件跟其它的可重定位文件和共享目标文件链接,产生新的目标文件;动态链接器也可以将几个共享目标文件与可执行文件结合,作为进程映像的一部分来运行,比如:在linux下的.so文件,在windows下的.DLL文件;
- 核心转储问价(Core Dump File):当进程意外终止时,系统可以讲该进程的地址空间的内容及终止时的一些其它信息转储到核心转储文件,比如:在linux下的core dump;
ELF File Layout:
每一个ELF文件都由ELF文件头(ELF Header)和文件内容组成,,ELF文件头包含了描述整个文件的基本属性,比如:ELF文件版本、目标机器型号、程序入口地址等,我们可以用readelf -h filename命令来查看filename的ELF文件头的内容,而文件内容则包含以下部分:
- Program header table,describing zero or more segments
- Section header table,describing zero or more sections
- Data referred to by entries in the program header table or section header table
Section header table(段表):保存section的属性,段名、段的长度、在文件中的偏移、读写权限以及其它属性。编译器、链接器和装载器都是依据段表来定位和访问各个段的属性的。段表是一个Elf32_Shdr的结构体数组,其定义在/usr/include/elf.h中。段表的偏移在ELF文件头中以shoff参数来表示。
目标文件中的内容至少有编译后的机器指令代码、数据以及链接时所需要的信息,比如:符号表、调试信息、字符串等。一般目标文件将这些信息按不同的属性,以“节”(section)的形式存储,有时候也叫“段”(segment),它们都表示一个一定的长度区域,唯一区别就是在ELF的链接视图和装载视图的时候。
全面讲解ELF的一篇文章:
阅读(1860) | 评论(0) | 转发(0) |