日期:2014-05-16 浏览次数:20728 次
?
1. gcc与g++编译流程:
预处理preprocessing --> 编译compilation --> 汇编assembly --> 链接linking
举例:
[hadoop@sam1 testGCC]$ cat hello.c
?
#include<stdio.h> int main(){ printf("in C"); return 0; }?
?
?
(0)一步到位的编译:
?
[hadoop@sam1 testGCC]$ ls
hello.c
[hadoop@sam1 testGCC]$ gcc hello.c -o hello
[hadoop@sam1 testGCC]$ ./hello
in C
?
可以使用-O选项告诉GCC对源代码进行基本优化,使程序执行更快,可以替换使用如下命令:
gcc hello.c -o hello -O0 ? ? ? ? ?//没有优化
gcc hello.c -o hello -O1 ? ? ? ? ?//缺省,主要进行跳转和延迟退栈两种优化
gcc hello.c -o hello -O2 ? ? ? ? ?//除了完成-O1 的优化之外,还进行一些额外的指令调整工作
gcc hello.c -o hello -O3 ? ? ? ? ?//除了完成-O2 的优化之外,还进行包括循环展开和其他一些与处理特性相关的优化工作
?
?
(1)预处理:源文件hello.c --> 预处理文件hello.i。只激活预处理,不生成文件,需要把它重定向到一个输出文件(预处理器的输出默认被送到标准输出,而非文件中)。
[hadoop@sam1 testGCC]$ ls
hello.c
[hadoop@sam1 testGCC]$ gcc -E hello.c -o hello.i
注:
hello.c后缀为c表示: ?
?? ? ? ? C source code which must be preprocessed.
-E ?Stop after the preprocessing stage; do not run the compiler proper.?The output is in the form of preprocessed source code, which is?sent to the standard output.
?? ? Input files which don't require preprocessing are ignored.
(2)编译:预处理文件hello.i --> 汇编文件hello.s。激活预处理,编译,把文件编译成汇编代码。
?
[hadoop@sam1 testGCC]$ ls
hello.c ?hello.i
[hadoop@sam1 testGCC]$ gcc -S hello.i -o hello.s
注:
hello.s:
Assembler code. 经过编译后产生了汇编代码
长这个样子:
.file "hello.c" .section .rodata .LC0: .string "in C" .text .globl main .type main, @function main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $16, %esp movl $.LC0, %eax movl %eax, (%esp) call printf movl $0, %eax leave ret .size main, .-main .ident "GCC: (GNU) 4.5.1 20100924 (Red Hat 4.5.1-4)" .section .note.GNU-stack,"",@progbits??
-S ?Stop after the stage of compilation proper; do not assemble. ?The?output is in the form of an assembler code file for each non-assembler input file specified.
?? ? By default