这些天遇到关于编译与链接的问题,所以根据网上资料写下了对这个过程进行简单梳理!
一、编译过程:
预处理 -->编译-->汇编
1、预处理:
完成对源程序的“替代”工作,主要对头文件宏定义,特殊字符处理
2、编译:
对语法进行差错,分析是否符合规则,然后翻译成汇编代码。
3、汇编:
把 汇编代码--->目标机器代码 的过程。
目标代码通常有两个段组成:
- 代码段:该段中包含主要的程序指令,一般可读可执行不可写。
- 数据段:存放全局或静态变量,可读可写可执行
二、链接过程:
将有关目标文件彼此连接,包括引用的一些库文件。
按需求分为两种:
- 静态链接:将代码从所在静态链接库中拷贝到可执行程序中。所以执行在执行的时候,这些代码将被装入到该进程的虚拟空间中。
- 动态链接:链接时只需要在最终可执行程序中记录下共享对象的名字以及少量登记信息,无需全部拷贝过来。程序运行时,动态链接库内容被映射到运行时相应虚地址空间。
三、gcc分步进行该过程:
Linux下我们使用 gcc编译器 把以上过程进行了捆绑,该命令一次完成所有工作。
过程 | 命令 | 执行前的文件 | 执行后的文件 | 对应命令 |
---|---|---|---|---|
预处理 | gcc -E | .c/.h | .i | cpp |
编译 | gcc -S | .i/.h | .s | cc -S |
汇编 | gcc -c | .s | .o | as |
链接 | gcc | .o | 可执行程序 | ld |
详细分析可参考博客: