######## 该系列博文为书籍《程序员的自我修养》的笔记 ##########
【说明】
前篇文章,我们对目标文件进行了简单的介绍,并利用一个例子让大家对目标文件内部内容有了了解。我们刚才是在linux下做的实验,用的是ELF格式的目标文件,那这个ELF格式到底是怎么定义的呢,它内部到底有什么呢,在这节及后面的文章中,将一步一步剖析ELF格式,了解作为linux下主流可执行文件,目标文件,乃至库文件格式的ELF到底是怎样的。
【基本框架】
不多说,一图便明白ELF的基本格式了。
1)前面是文件头,正如前面说的,里面含有文件的基本属性,注意,这些属性不是指文件名,文件访问权限。
2)下面是各个段,有系统定义的,也有我们自己定义的(如果源代码里写明的话)
3)再后面是各种表,比如符号表,重定位表,字符串表等等
4)注意,比如头文件的信息并不是文本格式的,也就是你直接打印看到的是乱码,因为里面放的是相对的数字,比如某一字节是1代表。。。
【文件头】
我们一个一个来分析,首先是文件头,也就是ELF Header.
用 readelf -h simp.o 可以读出文件头的信息,但是注意,文件内部并不是这么直接记录字符串的,而是某个数字,只不过readelf会解析这些
如果你英文不差,那上边一看就懂了,文件头里边包含了大量的信息。不过下面的篇幅中我们还是会整理出具体的说明的。
头文件相关信息被定义在 "/user/include /elf.h " 中,也就是如果你自己要创建ELF文件,也不需要自己再写结构体了,这里面有
elf.h里面定义了很多类型
没错,其实本质上就是linux本身定义的一些类型,重新定义好处就是一目了然,其实我们平时写C的时候也可以这么干,增加可读性
这里给出一个结构体,它就是真正被初始化然后当做ELF文件头写入ELF文件的。
看 了这个结构体,再结合上边的类型说明,就理解为什么我说文件头并不是直接记录字符串的了。
下面再截一张图,很好得介绍了各个结构体成员对应的刚才打印出来的文件头信息是什么。
现在对于文件头瞬间非常清晰了,不是吗?
1】 现在介绍一下
1)前面4个字节是真正的ASCII字符值:0X7F(DEL控制字符), 0X45(E), 0X4C(L), 0X46(F),哈哈。
2)第5字节表示是32位的还是64位的,1代表32位。 2代表64位
3)第6字节表示机器是大端还是小端,关于什么是大端小端我想就不用介绍了吧。。
4)第7字节表示ELF文件的主版本号,一般是1,
5)剩下9个字节没有定义,一般是0
2】再介绍一下 e_type ,表示文件的类型,有3种取值,还是定义在那个文件中
3】e_machine这个成员就是表示ELF文件的平台属性的。同样定义在那个文件中,下图说明
4】其他成员就是具体数值了,关于他们的作用,如果不懂没关系,在后面的文章中就能体会了。