c程序的编译过程
来源:互联网 发布:被网络诈骗怎么报案 编辑:程序博客网 时间:2024/04/30 08:53
一个c程序从源代码到可执行程序总共经历了4个步骤(以及对应的gcc 参数):
预编译(gcc -E),汇编(gcc -S),编译(gcc -c),以及链接(gcc)
以这个最简单的c程序为例:
fun.h头文件
//"func.h"void func(){ return 0;}
#include "func.h"#define TMP 1int main(){ int a = TMP; return func()}
gcc -o main.i -E main.c后输出
# 1 "main.c"# 1 "<built-in>"# 1 "<命令行>"# 1 "main.c"# 1 "func.h" 1int func(){ return 0;}# 2 "main.c" 2int main(){ int a = 1; return func();}
可以看出,预编译就是把程序包含的头文件原封不懂地放在源文件的上面,并把宏#define 等执行完
gcc -o main.s -S main.i 后输出
.file "main.c" .text.globl func .type func, @functionfunc:.LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $0, %eax leave .cfi_def_cfa 7, 8 ret .cfi_endproc.LFE0: .size func, .-func.globl main .type main, @functionmain:.LFB1: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $0, %eax call func leave .cfi_def_cfa 7, 8 ret .cfi_endproc.LFE1: .size main, .-main .ident "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-3)" .section .note.GNU-stack,"",@progbits
看到,汇编这一步的作用就是把c语言转换成对应的汇编语言
然后运行gcc -o main.o -c main.s
此时如果在查看main.o中的内容,会发现出现一大堆乱码,此时,main.o已经是二进制的机器码了
此时如果在执行 gcc -o app main.o,执行链接即可得到可执行文件app
链接做的事就是把系统中或第三方的库(windows下一般为dll文件,linux下一般为so文件)链接到程序中(静态或动态),然后得到的文件就是可执行文件了~
0 0
- C程序的编译过程
- C程序的编译过程
- C程序的编译过程
- C程序的编译过程
- c程序的编译过程
- C程序的编译过程
- C程序的编译过程
- C程序的编译过程
- c程序的编译过程
- C程序的编译过程
- C程序的编译过程
- C程序编译过程
- C程序编译过程
- C程序编译过程
- C程序编译过程
- C程序编译过程
- C程序编译过程
- C程序编译过程
- TI 蓝牙协议栈视频学习笔记
- 【Java算法】进3退一
- Spring 详解
- UNIX环境高级编程学习环境搭建---apue.h
- ubuntu利用dd命令备份系统
- c程序的编译过程
- Trie树与后缀树
- [百度笔试] 2014百度校园招聘软件研发题--武汉
- Word Break II
- 16. 事件
- Android基础之——第一个项目Hello word!
- Java学习笔记之反射机制初探
- [腾讯笔试] 2015腾讯校园招聘软件测试笔试题(笔试时间:2014-9-13
- jackson