码迷,mamicode.com
首页 > 其他好文 > 详细

链接,加载,装载(二)

时间:2015-06-12 06:28:00      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:

 

编译驱动程序(compiler driver)


 这代表用户在需要时调用语言预处理器、编译器、汇编器和链接器。

预处理器  cpp

c编译器 cc1

汇编器 as

链接器 ld

 

值得留意得是驱动程序经过相同的程序生成xxx.o,最后,它运行链接器程序ld,将main.o文件和xxx.o以及一些必要的系统目标文件组合起来,创建一个可执行目标文件。

像unix ld这样的静态链接器(static linker)以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的可以加载和运行的可执行目标文件作为输出。输入的可重定位目标文件由各种不同的代码和数据节(section)组成。指令在一个节中,初始化的全局变量在另一个节中,而未初始化的变量在另外一个节中。

 

 

技术分享

 

unix> ./p

 

再次铺垫下,外壳调用操作系统中一个叫做加载器的函数,它拷贝可执行文件p中的代码和数据到存储器,然后将控制转移到这个程序的开头。 

目标文件纯属字节块的组合。在这些块中,有些包含程序代码,有些则包含程序数据,而其他的则包含指导链接器和加载器的数据结构。链接器将这些块连接起来,确定被连接块的运行时位置, 并且修改代码和数据块中的各种位置。

 

 

目标文件


 

  1. 可重定位目标文件
  2. 可执行目标文件
  3. 共享目标文件

 

编译器和汇编器生成可重定位的目标文件(包括共享目标文件)。

链接器生成可执行目标文件。

 

目标文件的格式:

System V Unix  (COFF)Common Object File Format
Windows NT (PE)Portable Executable
Unix(如Linux, System V Unix后来的版本,各种 BSD Unix等) (ELF)Executable and Linkable Format

 

 

以下是一个ELF格式的可重定位目标文件:

技术分享

 

 

以下两个主题暂时跳过。

  • 符号和符号表
  • 符号解析

 

与静态库链接


 

在Unix系统中,静态库以一种称为存档(archive)的特殊文件格式存放在磁盘中。

存档文件是由一组连接起来的可重定位目标文件组合,有一个头部用来描述每个成员目标文件的大小和位置。

存档文件名由后缀.a标识。

 

to be continued ...

 

链接,加载,装载(二)

标签:

原文地址:http://www.cnblogs.com/dotdog/p/4570659.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!