程序的编译和链接过程

一、概述

一个程序在从源码变成二进制程序之间一共有四个步骤:预处理,编译,生成目标文件,链接。

以下展示了一个简单的加法程序的编译过程:

二、预处理

预处理阶段主要有以下的操作:

  • 头文件替换
  • 宏定义替换
  • 删除注释
  • 预处理指令处理

在 GCC 中,-E 选项用于预处理,执行 g++ main.cpp -E -o main.i

可以看到,main.i 的内容已经变得十分复杂,预处理后总共有接近两万行。

文件的后就是我们的实际代码区域,其中的头文件和注释也都被处理掉了。

三、编译

预处理完成后需要编译,编译是把程序编程汇编指令的过程。在这一阶段会分析代码,解析语法和错误。

-S 选项用用于生成汇编指令,生成后它依旧还是一个文本文件,执行 g++ main.i -S main.s 后的 main.s 中的内容:

四、生成目标文件

目标文件也就是我们所说的.o 文件了,在编译过后,文件还是不能直接被运行的。生成目标文件的过程会导出属于自己的符号表。这个步骤之后它就已经是一个二进制文件了,里面的符号可以通过诸如 readelf 的命令来读取出来。

生成目标文件的选项是-c,执行 g++ main.s -c main.o

实际上,如果不经过前面的两个步骤,直接对源文件使用-c 也能直接生成目标文件,编译器会自动执行中间的步骤:

五、链接

链接过程将把多个文件之间的符号表结合起来,生成最终的可执行文件。

 

发表评论