c源代码到可执行的过程

流程

  • 源代码(.c)(source code)预处理为拓展源代码(.i)
  • 拓展源代码(expanded source code)编译为汇编代码(.asm)
  • 汇编代码汇编成二进制文件(.obj文件)
  • 链接

源代码预处理为拓展源代码

  • 源代码即为我们编写的高级语言,为文本代码,可以用文本工具打开。
  • 语言执行的第一个过程就是预处理。它是由一个预处理器(preprocessor)进行的,主要的作用就是“替换”,包括将注释去掉、将#define定义的变量用实际的值代替等。C预处理器不是编译器的一部分,而是编译过程中的一个独立步骤。简单地说,C语言预处理器只是一个文本替换工具,它指示编译器在实际编译前做必要的预处理。

拓展源代码编译为汇编代码

  • 经过上述预处理之后的扩展源代码文件依然是不可以被执行的文件,下一步就是编译(compiling)。这里的编译就是用编译器将源代码文件转变成汇编代码文件。其结果是中间编译输出文件(intermediate compiled output file )。我们知道,早期为了让人能够拜托01组成的完全二进制的机器语言,人们发明了汇编语言,汇编语言的每一个指令都对应着二进制机器代码的一个指令,但是由于是基于英文缩写的字母和十六进制等组成的语言,人们已经能理解代码的含义了。

  • C语言的编译的第二个阶段就是将扩展源代码转化成汇编代码。注意,这不是必须的步骤。但是转成汇编代码可以帮助我们进行debug与优化。所以大多数编译过程都包含这个步骤。汇编代码的后缀是.s(windows下是asm文件)。

汇编代码汇编成二进制文件

  • 这一步就是将汇编代码转换成对应的二进制机器指令,一个二进制文件中基本上都最少有两个段,分别是代码段和数据段,执行后分别存放在对应寄存器里

链接

链接分为静态链接和动态链接,静态链接是将程序里依赖到的库文件、其他源文件的代码直接搬运到用到的程序中,而动态链接是函数的代码被放到称作是动态链接库或共享对象的某个目标文件中。链接程序此时所作的只是在最终的可执行程序中记录下共享对象的名字以及其它少量的登记信息。在此可执行文件被执行时,动态链接库的全部内容将被映射到运行时相应进程的虚地址空间。动态链接程序将根据可执行程序中记录的信息找到相应的函数代码。

至此即生成了可执行文件,可执行文件在不同操作系统下由对应的操作系统加载进内存,即将CPU指令寄存器设置成可执行文件入口,启动执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值