gcc编译程序的过程
【摘要】 我们通过编译一个程序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)