详解编译与链接(在linux系统下)

1. 翻译环境,在这个环境中源代码被转换成可执行的机器指令

   每一个源文件通过编译过程转换成目标代码,每个目标文件由链接器捆绑在一起,形成一个单一而完整的可执行程序

同时链接器同时也会引用标准C库函数中任何被该程序锁用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中。

2.执行环境,用于实际执行代码

编译本身也分为几个阶段

1.预处理

由test.c 文件变为test.i,编译器主要做文本操作,内容如下:

一 ,#include头文件的包含

二,#define符号的替换

三,注释的删除

我们可以在linux下查看编译器在预处理阶段到底做了什么

扫描二维码关注公众号,回复: 3686285 查看本文章

这是我写的test.c:


在我们实行预处理 gcc -E test.o test.i,预处理结束后结果放在test,i中,看下结果是不是我们刚才所说的呢?


大体结果就是这样,和我们所说的一样

2.编译--把c语言代码转换为汇编代码,主要包括:

一,语法分析

二,词法分析

三,语义分析

四,符号汇总(如全局变量 main()等)

linux,操作指令,gcc -S test.c 编译停下来后放在test.s中

汇编代码:


3.汇编--把汇编代码转换成二进制,形成符号表

linux,在gcc -c test.s test o 指令后结果保存在test.o中

结果是给机器看的,我们看不懂,我就不展示了

下面说下链接:

一,合并断表

二,符号标的合并和重定位(把test.o的文件和目标文件里的符号表合并,)

好了,到这里就说完了,希望大家能进步。






猜你喜欢

转载自blog.csdn.net/congjichukaishi/article/details/80186360
今日推荐