漫谈兼容内核之九:elf映像的装入(二)

漫谈兼容内核之九:elf映像的装入(二)

ID:14768784

大小:72.50 KB

页数:26页

时间:2018-07-30

漫谈兼容内核之九:elf映像的装入(二)_第1页
漫谈兼容内核之九:elf映像的装入(二)_第2页
漫谈兼容内核之九:elf映像的装入(二)_第3页
漫谈兼容内核之九:elf映像的装入(二)_第4页
漫谈兼容内核之九:elf映像的装入(二)_第5页
资源描述:

《漫谈兼容内核之九:elf映像的装入(二)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、漫谈兼容内核之九:ELF映像的装入(二)漫谈兼容内核之九:ELF映像的装入(二)[align=center][size=4][b]漫谈兼容内核之九:ELF映像的装入(二)[/b][/size][/align][align=center]毛德操[/align]上一篇漫谈介绍了在通过execve()系统调用启动一个ELF格式的目标映像时发生于Linux内核中的活动。简而言之,内核根据映像头部所提供的信息把目标映像映射到(装入)当前进程用户空间的某个位置上;并且,如果目标映像需要使用共享库的话,还要(根据映像头部所提供的信息)将所需的“解释器

2、”的映像也映射到用户空间的某个位置上,然后在从系统调用返回用户空间的时候就“返回”到解释器的入口,下面就是解释器的事了。如果目标映像不使用共享库,那么问题就比较简单,返回用户空间的时候就直接“返回”到目标映像的入口。现代的应用软件一般都要使用共享库,所以我们把这当作常态,而把不使用共享库的应用软件作为一种简化了的特例。映像装入用户空间的位置有些是固定的、在编译连接时就确定好了的;有些则是“浮动”的、可以在装入时动态决定;具体要看编译时是否使用了-fPIC选项。一般应用软件主体的映像都是固定地址的,而共享库映像的装入地址都是浮动的。特别地

3、,解释器映像的装入地址也是浮动的。2.ELF映像的结构每个操作系统对于在其内核上运行的可执行程序二进制映像都有特定的要求和规定,包括例如映像的格式,映像在用户空间的布局(程序段、数据段、堆栈段的划分等等),映像装入用户空间的地址是否可以浮动、以及如何浮动,是否支持动态连接、以及如何连接,如何进行系统调用,等等。这些要求和规定合在一起就构成了具体操作系统的“应用(软件)二进制界面(ApplicationBinaryInterface)”,缩写成ABI。显然,ABI是二进制映像的“生产者”即编译/连接工具和使用者即映像装入/启动手段之间的一

4、组约定。而我们一般所说的二进制映像格式,实际上并不仅仅是指字面意义上的、类似于数据结构定义那样的“格式”,还包括了跟映像装入过程有关的其它约定。所以,二进制映像格式是ABI的主体。目前的LinuxABI是在Unix系统5的时期(大约在1980年代)发展起来的,其主体就是ELF,这是“可执行映像和连接格式(ExecutableandLnkingFormat)”的缩写。读者已经看到,ELF映像文件的开始是个ELF头,这是一个数据结构,结构中有个指针(位移量),指向文件中的一个“程序头”数组(表)。各个程序头表项当然也是数据结构,这是对映像文

5、件中各个“节(Segment)”的(结构性)描述。从映像装入的角度看,一个映像是由若干个Segment构成的。有些Segment需要被装入、即被映射到用户空间,有些则不需要被装入。在前一篇漫谈中读者已经看到,只有类型为PT_LOAD的Segment才需要被装入。所以,映像装入的过程只“管”到Segment为止。而从映像的动态连接、重定位(即浮动)、和启动运行的角度看,则映像是由若干个“段(Section)”构成的。我们通常所说映像中的“代码段”、“数据段”等等都是Section。所以,动态连接和启动运行的过程所涉及的则是Section。

6、一般而言,一个Segment可以包含多个Section。其实,Segment和Section都是从操作/处理的角度对映像的划分;对于不同的操作/处理,划分的方式也就可以不同。所以,读者在后面将会看到,一个Segment里面也可以包含几个别的Segment,这就是因为它们是按不同的操作/处理划分的、不同意义上的Segment。Section也是一样。在Linux系统中,(应用软件主体)目标映像本身的装入是由内核负责的,这个过程读者已经看到;而动态连接的过程则由运行于用户空间的“解释器”负责。这里要注意:第一,“解释器”是与具体的映像相连系

7、的,其本身也有个映像,也需要被装入。与目标映像相连系的“解释器”也是由内核装入的,这一点读者也已看到。第二,动态连接的过程包括了共享库映像的装入,那却是由“解释器”在用户空间实现的。本来,看了内核中与装入目标映像有关的代码以后,应该接着看“解释器”的代码了。但是后者比前者复杂得多,也繁琐得多,原因是牵涉到许多ELF和ABI的原理和细节,所以有必要先对ELF动态连接的原理作一介绍。明白了有关的原理和大致的方法以后,具体的代码实现倒在其次了。前面讲过,Linux提供了两个很有用的工具,即readelf和objdump。下面就用这两个工具对映

8、像/usr/local/bin/wine进行一番考察,以期在此过程中逐步对ELF和ABI有所了解和理解,这也是进一步阅读、理解“解释器”的代码所需要的。我们用命令行“readelf–a/usr/local/

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。