拆解GCC命令的预处理-编译-汇编-链接4个阶段

在linux下使用gcc命令编译程序时,整个过程实际上在底层处理分为四个步骤--预处理/编译/汇编/连接

下面通过gcc的不同命令参数来拆解这四个步骤。


源代码:hello.c

#include <stdio.h>
#define PP printf

int main(int argc, char **argv) {
	int a = 5;
	PP("a = %d\n", a);

	return 0;
}

1/预处理(C预处理器)

gcc -E hello.c -o hello.i//使用cpp命令

打开预处理后的文件hello.i,发现已经与源文件大有不同。主要区别我在注释处说明。

# 1 "hello.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "hello.c"
# 1 "/usr/include/stdio.h" 1 3 4
# 28 "/usr/include/stdio.h" 3 4
....
extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__));
# 936 "/usr/include/stdio.h" 3 4

# 2 "hello.c" 2 //以上是插入的stdio.h头文件内容 


int main(int argc, char **argv) {
 int a = 5;
 printf("a = %d\n", a); //此处,宏定义PP被替换为printf

 return 0;
}


2/编译(C编译器)

gcc -S hello.i -o hello.s//使用cc1命令

打开编译后的文件hello.s,所有语句均已替换为汇编语言,这对于嵌入式开发非常有用。

	.file	"hello.c"
	.section	.rodata
.LC0:
	.st
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值