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文件格式相关的知识比较晦涩,我们只需要大概了解,有个初步印象即可,主要是为了理解内核模块的加载卸载以及符号导出,在后面提到相关名词不至于太陌生。

Copyright © 2088 世界杯预选赛南美_决赛世界杯 - scbfjc.com All Rights Reserved.
友情链接