gcc编译程序的过程

举报
yd_221104950 发表于 2020/12/02 23:25:35 2020/12/02
【摘要】 我们通过编译一个程序test.c,代码如下,来了解编译程序的过程。 #include <stdio.h> int main(){ printf("Hello world!"); return 0; } 1234567 1.预处理(Preprocessing) ~/Desktop/test$ gcc -E test.c -o test.i ~/Des...

我们通过编译一个程序test.c,代码如下,来了解编译程序的过程。

#include <stdio.h>

int main(){ printf("Hello world!"); return 0;
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

1.预处理(Preprocessing)

~/Desktop/test$ gcc -E test.c -o test.i
~/Desktop/test$ ls
test.c  test.i


  
 
  • 1
  • 2
  • 3
  • 4

-E选项:让编译器在预处理后停止,并输出预处理结果。

在本例中预处理结果就是将stdio.h 文件中的内容插入到test.c中,我们可以通过cat命令查看一下test.i文件的内容:

~/Desktop/test$ cat test.i
# 1 "test.c"
...

extern int printf (const char *__restrict __format, ...);

...
# 2 "test.c" 2


# 3 "test.c"
int main(){
 printf("Hello world!");
 return 0;
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

瞧!把头文件stdio.h的内容都插入到test.c文件中来了。

2.编译(Compilation)

~/Desktop/test$ gcc -S test.i -o test.s
~/Desktop/test$ ls
test.c  test.i  test.s

  
 
  • 1
  • 2
  • 3

预处理之后,可直接对生成的test.i文件编译,生成汇编代码。
-S选项:表示在程序编译期间,在生成汇编代码后停止,
-o选项:输出汇编代码文件。

编译成的汇编代码如下:

 .file   "test.c" .text .section .rodata
.LC0: .string "Hello world!" .text .globl  main .type   main, @function
main:
.LFB0: .cfi_startproc pushq   %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 leaq .LC0(%rip), %rdi movl $0, %eax call printf@PLT movl $0, %eax popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc
.LFE0: .size   main, .-main .ident  "GCC: (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0" .section .note.GNU-stack,"",@progbits
~ 
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

3.汇编(Assembly)

~/Desktop/test$ gcc -c test.s -o test.o
~/Desktop/test$ ls
test.c  test.i  test.o  test.s


  
 
  • 1
  • 2
  • 3
  • 4

gas汇编器负责将汇编代码文件test.s编译为目标文件。这是一个二进制文件。

4.连接(Linking)

~/Desktop/test$ gcc test.o -o test
~/Desktop/test$ ./test
Hello world!

  
 
  • 1
  • 2
  • 3

gcc连接器将生成的test.o与C标准输入输出库进行连接,最终生成程序test。
gcc连接器是gas汇编器提供的,负责将程序的目标文件与所需的所有附加的目标文件连接起来,最终生成可执行文件。附加的目标文件包括静态连接库和动态连接库。

文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_40763897/article/details/88425173

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。