Linux下C语言的编译全过程解读
我们总是在Linux下输入 gcc -o app main.c 即可编译好程序,对于具体的详细过程及流程,相信亲们就不太了解啦!下面给大家展示一下C编译器的解释全过程。
Linux下编辑调试工具: gcc gdb ,把高级语言编译成二进制可执行代码的工具。
把高级语言编译成二进制可执行文件的过程如下:
需要经历四个步骤:
(1)预处理:去掉注释,进行宏替换(#define相关),头文件(#include)包含等工作。
gcc–E test.c –o test.i
(2)编译:不同平台用的汇编语言是不一样的。编译将高级语言编译成汇编语言
gcc–Stest.c –o test.s
如下:moretest.c
#include <stdio.h>#define PI 3.14
int main(int argc, char *argv[]){
printf("Hello world! %f \n",PI);
return 0;
}
如下:
gcc–Stest.c –o test.s
moretest.s
.file "main.c"
.section .rodata
.LC0:
.string "Hello world! %f \n"
.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
subq $16, %rsp
movl %edi, -4(%rbp)
movq %rsi, -16(%rbp)
movl $.LC0, %eax
movsd .LC1(%rip), %xmm0
movq %rax, %rdi
movl $1, %eax
call printf
movl $0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.section .rodata
.align 8
.LC1:
.long 1374389535
.long 1074339512
.ident "GCC: (GNU) 4.4.720120313 (Red Hat 4.4.7-3)"
.section .note.GNU-stack,"",@progbits
(3)汇编:将汇编语言翻译成二进制的目标代码
此过程生成ELF格式的目标代码
gcc–c test.c –o test.o
如下:moretest.o
test.o:ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
注意:relocatable为可重定位
test.o:可重定位文件:就是我们说的目标文件,没有连接之前的
(4)链接:包含各函数库的入口,得到可执行代码
gcc –o test test.c
如下:more test
test:ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (usesshared libs), for GNU/Linux 2.6.18, not strippedt
注意:链接过程。生成可执行代码。
链接分为两种,一种是静态链接,另外一种是动态链接。使用静态链接的好处是,依赖的动态链接库较少,对动态链接库的版本不会很敏感,具有较好的兼容 性;缺点是生成的程序比较大。使用动态链接的好处是,生成的程序比较小,占用较少的内存。