注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mihooke's blog

IT之恋

 
 
 

日志

 
 

《深入理解计算机系统》笔记(三)  

2014-09-19 19:24:16|  分类: 学习录 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

七、链 接


1、链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程。它可以执行于编译时、加载时、运行时。

2、目标文件并不能直接执行,它首先需要载入到链接器中,链接器确认main函数为初始进入点,把符号引用绑定到内存地址,把所有的目标文件集中在一起,再加上库文件,从而产生可执行文件

3、为了构造可执行文件,链接器必须做符号解析重定位。符号解析:目标文件定义和引用符号,目的是将每个符号引用刚好和一个符号定义联系起来。重定位:编译器和汇编器生成从地址0开始的代码和数据节,链接器把每个符号与一个存储器位置联系起来,然后修改对这些符号的引用,从而重定向这些节。

4、ELFUNIX 可执行和和可链接格式),典型的ELF可重定位目标文件:

《深入理解计算机系统》笔记(三) - mihooke - mihooke的博客

5、函数和已初始化的全局变量是强符号,未初始化的全局变量时弱符号。链接器如何解析多重定义的全局符号:不允许有多个强符号;如果有一个强符号和多个弱符号,则选择强符号;如果有多个弱符号,那么从中任意选一个。

6、Unix系统中,静态库以一种称为存档的特殊文件格式存放在磁盘中。存档文件是一组连接起来的可重定位目标文件的集合,有一个头部用来描述每个成员目标文件的大小和位置,后缀名是 .a。

7、重定位条目:放在.rel.text中,已初始化的重定位条目放在.rel.data中,两个最基本的重定位类型:R_386_PC32:重定位一个使用32位PC(程序计数器)相对地址的引用。一个PC相对地址就是距PC的当前运行值的偏移量,PC值通常是存储器中下一条指令的地址。R_386_32:重定位一个使用32位绝对地址的引用。

8、加载器将可执行目标文件中的代码和数据从磁盘拷贝到存储器中,然后通过跳转到程序的第一条指令或入口点来运行该程序,这个就是加载可执行目标文件过程。


9、每个C程序都需要一个main函数,因为C的启动代码对于每个C程序都是相同的,都要跳转到一个叫main函数上。main以return语句终止,那么控制传递回启动程序,该程序通过调用_exit再将控制返回给系统;如果用户忽略了return语句,也会发生相同的情况;如果直接调用exit终止,那么最终也是通过调用_exit将控制返回给系统。三种情况是一样的结果。

10、动态链接器通过执行下面的重定位来完成链接任务:重定位libc.so的文本和数据到某个存储器段;重定位libvector.so的文本和数据到另一个存储器段;重定位可执行文件中所有对libc.so和libvector.so定义的符号的引用。

与位置无关代码(PIC):为了解决多个进程共享程序的一个拷贝问题,更好的方法是编译库代码,使得不需要链接器修改库代码就可以在任何地址加载和执行这些代码。

  评论这张
 
阅读(80)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017