2006世界杯巴西
1.Linux内核模块¶
1.2.1.1. ko文件的文件格式¶
ko文件在数据组织形式上是ELF(Excutable And Linking Format)格式,是一种普通的可重定位目标文件。
这类文件包含了代码和数据,可以被用来链接成可执行文件或共享目标文件,静态链接库也可以归为这一类。
ELF 文件格式的可能布局如下图。
文件开始处是一个ELF头部(ELF Header),用来描述整个文件的组织,这些信息独立于处理器,
也独立于文件中的其余内容
我们可以使用readelf工具查看elf文件的头部详细信息。
程序头部表(Program Header Table)是个数组结构,它的每一个元素的数据结构如下每个数组元素表示:
一个”段”:包含一个或者多个”节区”,程序头部仅对于可执行文件和共享目标文件有意义
其他信息:系统准备程序执行所必需的其它信息”
节区头部表/段表(Section Heade Table)
ELF文件中有很多各种各样的段,这个段表(Section Header Table)就是保存这些段的基本属性的结构,
ELF文件的段结构就是由段表决定的,编译器、链接器、装载器都是依靠段表来定位和访问各个段的属性的
包含了描述文件节区的信息。
ELF头部中:
e_shoff:给出从文件头到节区头部表格的偏移字节数,
e_shnum:给出表格中条目数目,
e_shentsize: 给出每个项目的字节数。
从这些信息中可以确切地定位节区的具体位置、长度和程序头部表一样,
每一项节区在节区头部表格中都存在着一项元素与它对应,因此可知,这个节区头部表格为一连续的空间,
每一项元素为一结构体(思考这节开头的那张节区和节区头部的示意图)。
我们可以加上-S参数读取elf文件的节区头部表的详细信息。
节区头部表中又包含了很多子表的信息,我们简单的来看两个。
重定位表
重定位表(“.rel.text”)位于段表之后,它的类型为(sh_type)为”SHT_REL”,即重定位表(Relocation Table)
链接器在处理目标文件时,必须要对目标文件中某些部位进行重定位,即代码段和数据段中那些对绝对地址的引用的位置,
这些重定位信息都记录在ELF文件的重定位表里面,对于每个须要重定位的代码段或者数据段,都会有一个相应的重定位表
一个重定位表同时也是ELF的一个段,这个段的类型(sh_type)就是”SHT_REL”
读取重定位表。
字符串表
ELF文件中用到了很多字符串,比如段名、变量名等。因为字符串的长度往往是不定的,
所以用固定的结构来表示比较困难,一种常见的做法是把字符串集中起来存放到一个表,然后使用字符串在表中的偏移来引用字符串。
一般字符串表在ELF文件中也以段的形式保存,常见的段名为”.strtab”(String Table 字符串表)或者”.shstrtab”(Section Header String Table 段字符串表)
读取节区字符串表。
ELF文件格式相关的知识比较晦涩,我们只需要大概了解,有个初步印象即可,主要是为了理解内核模块的加载卸载以及符号导出,在后面提到相关名词不至于太陌生。