每日总结-第二十二天-gcc

2020-04-25  本文已影响0人  SamiraG

编译流程

gcc、g++分别是gnu的c、c++编译器,gcc/g++在执行编译工作的时候,总共需要4步:

源码从前端经过词法分析、语法分析/语义分析之后生成AST/GENERIC,再转换成GIMPLE中间表示,GCC还需要对GIMPLE进行低级化、IPA处理等,再转成SSA优化后生成RTL,最终才生成汇编代码,整个过程如下:



gcc编译系统主要由三部分组成:与语言相关的前端、与语言无关的后端、与机器相关的机器描述
GCC的优化流程主要是: 编译器首先从编译命令行中解析出优化参数,经过语法分析器将源程序翻译成等价的AST(抽象语法树)形式; 再由中间代码生成器将AST转换为RTL(Register transfer language);然后由优化器根据解析出的优化参数实施相应的优化策略;最后由代码生成器读入优化后的RTL并生成可执行机器码予以输出。事实上,GCC的优化绝大部分都是在RTL这个层次上实施的。

参数详解

gcc -E test.c > test.txt
#include<stdio.h>
int main(void)
{
  // Print the string
   printf("\n The Geek Stuff\n");
   return 0;
}

使用-ansi参数编译上面的代码会出错,因为ISO C89不支持C++风格的注释。

test.o: test.c /usr/include/stdc-predef.h /usr/include/stdio.h \
 /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \
 /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \
 /usr/include/x86_64-linux-gnu/bits/wordsize.h \
 /usr/include/x86_64-linux-gnu/bits/long-double.h \
 /usr/include/x86_64-linux-gnu/gnu/stubs.h \
 /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
 /usr/lib/gcc/x86_64-linux-gnu/8/include/stddef.h \
 /usr/lib/gcc/x86_64-linux-gnu/8/include/stdarg.h \
 /usr/include/x86_64-linux-gnu/bits/types.h \
 /usr/include/x86_64-linux-gnu/bits/typesizes.h \
 /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \
 /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \
 /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \
 /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \
 /usr/include/x86_64-linux-gnu/bits/types/FILE.h \
 /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \
 /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \
 /usr/include/x86_64-linux-gnu/bits/sys_errlist.h
$ gcc -c -Wall -Werror -fPIC Cfile.c
$ gcc -shared -o libCfile.so Cfile.o
#include<stdio.h>
int main(void)
{
#ifdef MY_MACRO
  printf("\n Macro defined \n");
#endif
  char c = -10;
  // Print the string
   printf("\n The Geek Stuff [%d]\n", c);
   return 0;
}

-D可以用作从命令行定义宏MY_MACRO。

$ gcc -Wall -DMY_MACRO main.c -o main
$ ./main
 Macro defined 
 The Geek Stuff [-10]
$ cat opt_file 
-Wall -omain
# opt_file包含编译参数
$ gcc main.c @opt_file
main.c: In function ‘main’:
main.c:6:11: warning: ‘i’ is used uninitialized in this function [-Wuninitialized]
上一篇 下一篇

猜你喜欢

热点阅读