设为首页 加入收藏

TOP

3.5.3 链接程序输出
2013-10-12 06:48:54 来源: 作者: 【 】 浏览:101
Tags:3.5.3 链接 程序 输出

3.5.3  链接程序输出

链接程序对输入的一个或多个模块文件以及相关的库函数模块进行处理,最终生成相应的二进制执行文件或一个由所有模块组合而成的大模块文件。在这个过程中,链接程序的首要任务是给执行文件(或者输出的模块文件)进行存储空间分配操作。一旦存储位置确定,链接程序就可以继续执行符号绑定操作和代码修正操作。因为模块文件中定义的大多数符号与文件中的存储位置有关,所以在符号对应的位置确定之前符号是没有办法解析的。

每个模块文件中包括几种类型的段,链接程序的第二个任务就是把所有模块中相同类型的段组合连接在一起,在输出文件中为指定段类型形成单一一个段。例如,链接程序需要把所有输入模块文件中的代码段合并成一个段放在输出的执行文件中。

对于a.out格式的模块文件来说,由于段类型是预先知道的,因此链接程序对a.out格式的模块文件进行存储分配比较容易。例如,对于具有两个输入模块文件和需要连接一个库函数模块的情况,其存储分配情况如图3-9所示。每个模块文件都有一个代码段(text)、数据段(data)和一个bss段,也许还会有一些看似外部(全局)符号的公共块。链接程序会收集每个模块文件包括任何库函数模块中的代码段、数据段和bss段的大小。在读入并处理了所有模块之后,任何具有非零值的未解析的外部符号都将作为公共块来看待,并且把它们分配存储在bss段的末尾处。

 
(点击查看大图)图3-9  目标文件的链接操作

此后链接程序就可以为所有段分配地址。对于Linux 0.12系统中使用的ZMAGIC类型的a.out格式,输出文件中的代码段被设置成从固定地址0开始。数据段则从代码段后下一个页面边界开始。bss段则紧随数据段开始放置。在每个段内,链接程序会把输入模块文件中的同类型段顺序存放,并按字进行边界对齐。

当Linux 0.12内核加载一个可执行文件时,它会根据文件头部结构中的信息首先判断文件是不是一个合适的可执行文件,即其魔数类型是否为ZMAGIC,然后系统在用户态堆栈顶部为程序设置环境参数和命令行上输入的参数信息块并为其构建一个任务数据结构。接着在设置了一些相关寄存器值后利用堆栈返回技术去执行程序。执行程序映像文件中的代码和数据将会在实际执行到或用到时利用需求加载技术(Load on demand)动态加载到内存中。

Linux 0.12内核的编译是根据内核的配置文件Makefile使用make命令指挥编译器和链接程序操作而完成的。在编译过程中make还利用内核源代码tools/目录下的build.c程序编译生成了一个用于组合所有模块的临时工具程序build。由于内核是由引导启动程序利用ROM BIOS中断调用加载到内存中的,因此编译产生的内核各模块中的执行头结构部分需要去掉。工具程序build的主要功能就是分别去掉bootsect、setup和system文件中的执行头结构,然后把它们顺序组合在一起产生一个名为Image的内核映像文件。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇3.3.4 寄存器变量 下一篇3.5.1 目标文件格式

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: