程序编译和链接的过程

马谦马谦马谦 2018年9月14日23:08:41 发表评论
文章最后编辑于:2018-9-14 23:14:12

一、概述

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

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

二、预处理

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

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

在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也能直接生成目标文件,编译器会自动执行中间的步骤:

五、链接

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

 

本文共执行45次查询,耗时0.272秒!
马谦马谦马谦

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: