【链接】编译器驱动程序、目标文件

1、编译器驱动程序

1)编译系统

  • 大多数编译系统提供编译器驱动程序(compiler driver),它代表用户需要时调用语言预处理器编译器汇编器链接器
  • 一个程序从源程序翻译为可执行目标文件,经历四个阶段,预处理器->编译器->汇编器->链接器
    执行这四个阶段的程序一起构成了编译系统

2)编译过程

示例程序hello.c
#include <stdio.h>
int main()
{
    
    
	printf("Hello World.\n");
	return 0;
}
  • 预处理阶段。预处理器(cpp),根据#开头的命令(如#include <stdio.h>),读取指定文件,并直接插入到程序文本中,得到另一个C程序,以.i作为扩展名,hello.i
  • 编译阶段。编译器(cc1),编译器将文本文件hello.i翻译成文本文件hello.s,它是一个ASCII汇编语言程序。
  • 汇编阶段。汇编器(as),汇编器将hello.s翻译成机器语言指令,并将其打包成可重定位目标程序格式,保存在hello.o的二进制文件中,它包含的是函数main的指令编码,若用文本编辑器打开,看到的是乱码
  • 链接阶段。hello程序中存在printf这样的函数,而此函数是存在名为printf.o的预编译好的文件中,链接器就是负责以某种方式将其合并到hello.o中来,运行链接程序(ld)从而得到可执行文件hello。

2、目标文件

目标文件有三种形式

  • 可重定位目标文件。包含二进制代码数据,其形式可以在编译时与其他可重定位目标文件合并起来,创建一个可执行目标文件。
  • 可执行目标文件。包含二进制代码数据,其形式可以被直接复制到内存并执行。
  • 共享目标文件。一种特殊类型的可重定位目标文件,可以在加载或者运行时被动态地加载进内存并链接。

参考

《深入理解计算机系统》第1章.计算机系统漫游
《深入理解计算机系统》第7章.链接

猜你喜欢

转载自blog.csdn.net/weixin_40910614/article/details/112477273