浅析程序的链接与加载


前言


实际上光是链接这一块就有很多大牛洋洋洒洒的写成一本书了,所以本文只是简要的介绍链接、加载的基本原理、要完成的工作等,并不涉及流程与实现细节。另本文主要针对C语言程序与Unix系统。


C语言程序的生命周期


  • 编写源码。编写hello.c源码文件,它遵循某种字符编码格式,最终以字节序列的形式存储在文件中。
  • 预处理。根据源码中的预处理命令,修改原始C程序,得到修改过的程序hello.i。
  • 编译。编译器将源码中的内容翻译成汇编语言程序hello.s。
  • 汇编。汇编器将hello.s翻译成机器语言指令,并将这些指令打包成一种叫做可重定位目标程序(relocatable object program)的格式,得到hello.o,它是一个二进制文件,即它的字节编码是机器指令,而不是某种格式的字符。
  • 链接。链接器将hello.o与它所使用到的库函数以某种格式合并成一个可执行目标文件hello,它可以被加载到内存中,由系统执行。

链接的任务


从上文中的链接过程可以看到,链接器的任务是合并各个独立的可重定位目标文件,最终得到一个可执行目标文件。在构造可执行文件的过程中,链接器必须完成两个主要任务:

  • 符号解析:将每个符号引用(变量与函数引用)刚好和一个符号定义联系起来。
  • 重定位:编辑器和汇编器生成从地址0开始的代码和数据节。在汇编器生成的可重定位目标程序中,数据和代码的位置都是局部的逻辑地址,而想要在系统中执行这些指令,就需要以某种方式将这些逻

你可能感兴趣的:(计算机基础,链接,计算机基础)