ELF(Executable and Linkable Format),即“可执行可链接格式”,最初由UNIX系统实验室作为应用程序二进制接口(Application Binary Interface – ABI)的一部分而制定和发布,是COFF(Common file format)格式的变种。Linux系统上所运行的就是ELF格式的文件,相关定义在“/usr/include/elf.h”文件里。
它和在Windows下pe文件是相对的。
可以看到ELF文件非常的多,我没有细细的看。
可执行文件(executable file):经过链接的、可执行的目标文件,通常也被称为程序。
可重定位文件(relocatable file):由源文件编译而成且尚未链接的目标文件,通常以“.o”作为扩展名。用于与其他目标文件进行链接以构成可执行文件或动态链接库,通常是一段位置独立的代码(Position Independent Code, PIC)。
对于.o结尾的文件,在编译的时候可以link到我们的程序中去
共享目标文件(shared object file):动态链接库文件。用于在链接过程中与其他动态链接库或可重定位文件一起构建新的目标文件,或者在可执行文件加载时,链接到进程中作为运行代码的一部分。
在ELF文件格式规范中,ELF文件被统称为object file,这与我们通常理解的.o文件是不太一样的。
下面我们先从链接视角去来看看:
(这是简化版的elf文件头)
我们可以看见代码段(.text)和数据段(.data)是分开处理的,这一点就是从安全的角度去出发考虑的。
下面我们自上而下的介绍链接视角去看的elf文件.
首先我们写一个简单的helloworld程序,然后使用gcc编译器将编译过程中的中间文件给生成出来。
我们额可以通过gcc生成几个不同main可执行文件过程中的几个中间文件查看elf文件readelf -h main
我们可以看见这个第一条就是一个magic,这个是个什么意思呢??这个美其名曰魔术字符(7f 45 4c 46),当文件被映射到内存中的时候,通过寻找这
个字符可以确定映射的地址。
这里我们给出ELF64_Ehdr结构体的代码:
看完了elf_hander下面我们就来看看section节:
读取节头表 readelf -S main.o
至于另外的两个.data和.bss段我不想看了,因为腿这会麻了。
这是一些其他节的东西,我看着书上面写出来的我复制一些吧,也算自己记忆。
字符串表(shstrtab和strtab)中包含了以null结尾的字符序列,用来表示符号名和节名,引用字符串时只需给出字符序列在表中的偏移即可。字符串表的第一个字符和最后一个字符都是null字符,以确保所有字符串的开始和终止。
num就是索引值。
接下来我们看的是重定位
重定位是连接符号定义与符号引用的过程。可重定位文件在构建可执行文件或共享目标文件时,需要把节中的符号引用换成这些符号在进程空间中的虚拟地址。
这里offset是在重定位时候需要被修改的符号偏移,info分为两个部分:type知识如何修改引用,symbol指示应该修改引用为那个符号,addend表示对于被修改符号的引用做偏移调整。
以上呢就是在link视角下去看elf文件了
手机扫一扫
移动阅读更方便
你可能感兴趣的文章