入口 gcc-4.6.0/gcc/gcc.c

来源:互联网 发布:逆战刷枪软件永久教程 编辑:程序博客网 时间:2024/06/06 12:22
gcc程序入口。分析gcc工作流程的起点。
 
示例:
执行命令:
         /usr/bin/gcc -o /home/malele/hello.o /home/malele/hello.c
main函数
----------------------------
输入: int argc,参数个数;
       char **argv,参数,字符串数组。
输出:
----------------------------
执行过程:
1, 处理第一个参数:arg[0]:"/usr/bin/gcc". 提取程序名称"gcc", 从后往前扫描arg[0],用方法xmalloc_set_program_name()[./libiberty/xmalloc.c Line106]记录之. 方法IS_DIR_SEPARATOR(ch) [./libiberty/basename.c Line36/38]用于判断是否为目录分隔符(linux下"/",windows下"\\").
2, 展开@参数:
         expandargv(&argc, &argv) [./libiberty/argv.c Line 383]. 该函数处理文件名列表中以@开头的参数,并将其展开为实际的文件名。

3, 将参数全部存储到数组中:
     

  1. /*将main函数中的argc,argv存储的命令行选项信息存储到数组中, 指针*DECODED_OPTIONS指向这个数组, *decoded_options_count指向用于表示数组大小的数值. 数组的第一项是命令行命令中的程序名称(OPT_SPECIAL_program_name,如gcc)*/
  2. //main调用
  3. decode_cmdline_options_to_array (argc, CONST_CAST2 (const char **, char**,argv),CL_DRIVER,&decoded_options, &decoded_options_count);
  4. //定义 
  5. void
  6. decode_cmdline_options_to_array (unsigned int argc, const char **argv, 
  7.  unsigned int lang_mask,
  8.  struct cl_decoded_option **decoded_options,
  9.  unsigned int *decoded_options_count)



----------------------------

----------------------------
备注:

1,ftell函数,标准库函数,获取当前输入流指针位置

2,gcc [@files] , 参数files中存储了gcc的命令行参数;编译器会将文件中的内容读出并作为gcc参数来代替@files参数。files中可能还会有@声明,编译器递归处理。gcc最多能处理2000个@命令,详见[./libiberty/argv.c Line391].。
 
 
 
原创粉丝点击