编译系统(预处理-编译-汇编-链接)

    以Hello World程序为例,让我们来看看这段代码是怎么被系统执行的。

#include <stdio.h>

int main()
{
	printf("Hello, Wrold\n");
	return 0;
}

预处理

当你写完这段代码,保存后会生成一个以.c为结尾的文件(这里假设它为hello.c)。点击运行后,预处理器会根据#include <stdio.h>,随后读取stdio.h中的内容,并直接插入到hello.c中,得到一个名为hello.i的文件。

 编译

  得到了hello.i之后,编译器需要将这个文件翻译成汇编语言。并得到hello.s文件。这里汇编语言就像是一种通用语言。这样就算是不同的高级语言的不同编译器最后都有能着相同的汇编语言。

  这里补充点汇编语言的知识。这里的%rsp代表的栈指针,用来指明运行时栈的结束位置。subq为减法操作,格式为[SUB S,D],意为D=D-S。

main:
    subq     $8,%rsp
    movl     $.LCO,%edi
    call     puts
    movl     $0,%eax
    addq     $8,%rsp
    ret

 汇编

  在得到了hello.s文件后,汇编器会把该文件翻译为机器指令,并打包为计算机可识别的二进制文件可重定位目标程序hello.o。

 链接

  虽然hello.o为二进制文件,但仍然不能执行。在一开始的代码中,我们调用了stdio.h中的printf函数,这个函数存在于一个名为printf.o的文件当中。为什么hello.o叫可重定位目标程序呢?为了能正常调用printf这个函数,print.o这个文件必须通过链接器被合并到我们的hello.o文件中,最后生成一个可执行目标文件。所以hello.o被称为可重定位目标文件。

 流程图

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值