连接器为程序分配相对地址,加载器完成重定位功能并将相对地址映射为实际地址。重定位其实就是一个对
指令代码进行修改的过程。
两遍链接过程
(1)链接器首先对各输入文件进行扫描,得到各个段的大小,并搜集所有符号的定义和引用(从符号表)
,创建一个包含输入文件中定义的所有段的段表,和包含所有导出,导入符号的符号表。
(2)第二遍采用第一遍得到的信息进行目标代码重定位,以及调整代码和数据的内存地址,生产输入文件
头信息,符号表信息和最后的输出文件,一般的目标代码都预留有调试符号信息。
在连接的时候,如果连接器处理完所有的输入文件后,还存在未解析的导入名称,它将在库中查找
,并将导出该名称的任何文件链接进来。其实,链接器在连接的时候会识别时解析未定义符号需要的共享库
,但是连接器仅在输出文件中标明解析这些符号的库名字,而不将它们连接到程序中,具体的绑定操作是在
程序加载时进行的。
可执行文件映射到内存中有三种方式:
(1)只读(RO),不能重定位的代码和只读数据,可执行代码等
(2)读写(RW),
(3)写时复制(COW),普通的数据
可执行文件的每个段都需要页边界对齐(一般为4k),一般包括以下信息:头信息,目标代码,重定位信息
,符号,调试信息。调试信息包括源文件名称,路径和行号等信息。
阅读(979) | 评论(0) | 转发(0) |