程序员自我修养第三章解析(1)

程序员自我修养第三章解析(1)
图3-1ELF之间关系

Linux的ELF文件包括.o文件,可执行文件,以及动态库,静态库,.o文件进一步加工可以变成.so动态库,可执行文件以及.o文件打包可以变成.a静态库
现在来分析对应.o里面的具体内容
有个模板函数
程序员自我修养第三章解析(1)
图3-2模板函数
这个函数是简单实现了打印对应整数功能,对这个函数进行编译得到对应的.o
gcc -m32 -c test.c
这个时候的.o叫做可重定向文件,不是可执行文件,现在先来分析一下这个可重定向文件的具体架构,晚点在进行分析其他类型,其他类型也属于ELF,结构上一样,只是由细微的不一样.

程序员自我修养第三章解析(1)
图3-3ELF文件架构
可以看到ELF文件主要由ELF头部以及ELF body组成,操作系统对于ELF关心的是里面的代码段以及数据段,(写完程序进行编译之后代码是放在代码段,数据是放在数据段的),因为代码段保存操作系统想要执行代码,数据段保存操作系统想要的数据,那么操作系统是怎样知道对应的段?
操作系统先找到ELF头部(这个在ELF文件的开头),然后依据头部信息,找到对应的段表描述符的位置,可以看到这个是在ELF_body里面,然后再通过描述符去找到对应段,看起来是不是很简单,就想你想找铜锣湾扛把子,先有个接头人(ELF_HEADER),然后通过这个接头人找到中间人(段表描述符),通过中间人介绍,你就认识了铜锣湾扛把子了(对应段的信息),再这里段的英文名叫section,后面出现section表示段,现在来看一下接头人(ELF_HEADER)会给你哪些信息,以及怎样去解析这些信息.
这个是用readlf –h test.o打印出来ELF文件的头部信息的结果,readelf是linux的一个命令,主要用于解析ELF文件.
程序员自我修养第三章解析(1)
图3-4 ELF文件头部内容

这个是用软件打开刚刚编译的test.o文件,里面都是二进制数据,现在来解析这些二进制数据
程序员自我修养第三章解析(1)
图3-5ELF文件部分内容

程序员自我修养第三章解析(1)
图3-6ELF文件部分内容2

那么readelf是怎样解析这个头部,Readelf工具用一个结构体来表示对应ELF文件头部的内容,现在来对每个内容进行分析,这个结构体定义Elf32_Half, Elf32_Word, Elf32_Off,这里名字写了32,然后没有写half的就表示对应的内容占用32位,有half的就表示占用16位.
程序员自我修养第三章解析(1)
图3-7ELF头部解析结构体

(1)可以看到对应的ELF文件结构体的开头用了一个16字节的char类型来表示,现在来分析e_ident每个字节表示什么意思?
程序员自我修养第三章解析(1)
图3-8ELF ident字段详解

(2)elf头部结构体每个字段的含义
程序员自我修养第三章解析(1)
图3-9ELF头部信息1

程序员自我修养第三章解析(1)
图3-10ELF头部信息2

程序员自我修养第三章解析(1)
图3-11ELF头部信息3

大家把这个图里面每个数字与对应readelf –h test.o 打印出来的数据对比是一样.再解析了头部信息得到section表的位置以及大小信息(这个section表对应的是每个段的描述信息,不是每个段的内容).
程序员自我修养第三章解析(1)
图3-12SECTION表位置
在解析了头部字段之后要进行对body进行解析,现在来用readelf文件进行对.o文件的每个段进行分析,这里可以看到
Starting at offset 0x424这里就等于readelf –h 里面的start of section headers里面打印1060,表示这个section描述符再文件的偏移,那就表示,接下来应该分析0x424这个地址就可以得到section的信息,(就好比:他告诉你铜锣湾扛把子再铜锣湾图书馆附近,你应该去铜锣湾图书馆找他);
程序员自我修养第三章解析(1)
图3-13ELF段描述符内容
来看一下readelf –S 对应每一列打印,包含的含义.
程序员自我修养第三章解析(1)
图3-14ELF段描述符内容解析

接着我们看readelf工具怎样分析这个段描述符的,找到段描述符地址相对文件偏移0X424,
这个地址之后按照下面的结构体来组成的,现在来具体分析每个字段的内容.

程序员自我修养第三章解析(1)
图3-15ELF段描述符结构体

**

(1)NULL段分析

程序员自我修养第三章解析(1)
具体分析过程:
程序员自我修养第三章解析(1)
图3-17ELF 段描述符与对应值1

程序员自我修养第三章解析(1)
图3-18ELF 段描述符与对应值2
程序员自我修养第三章解析(1)
图3-19ELF 段描述符与对应值3

(2).group段分析

程序员自我修养第三章解析(1)

程序员自我修养第三章解析(1)
图3-20ELF .group段描述符与对应值1

程序员自我修养第三章解析(1)
图3-21ELF .group段描述符与对应值2

其他的段与这个分析方法一样,这样就找到每个section的再文件中的地址了,以及对应的虚拟地址了.
所以可以看到整个elf文件:

程序员自我修养第三章解析(1)
图3-22ELF 文件内容
程序员自我修养第三章解析(1)