做多语言版本网站,如何增强网站的安全性,网站建设策划书,西安做网站缑阳建在 GCC 编译一个 C 源代码时#xff0c;先会通过宏处理#xff0c;形成 一个叫转译单元#xff08;translation_unit#xff09;#xff0c;接着进行语法分析#xff0c;C 的语法分析入口是
static void c_parser_translation_unit(c_parser *parser); 接着就通过类似递… 在 GCC 编译一个 C 源代码时先会通过宏处理形成 一个叫转译单元translation_unit接着进行语法分析C 的语法分析入口是
static void c_parser_translation_unit(c_parser *parser); 接着就通过类似递归下降解析器Recursive descent parser的方式进行语法解析。当完成一个函数的解析后会将该函数加入到符号表Symbol Table中的调用图Call Graph的节点集nodes中。通过下面 gdb 的 backtrace 可以看到
#0 cgraph_node::get_create (decl0x7ffff79b2700) at gcc-project/gcc/cgraph.cc:537
#1 0x00000000012d06d4 in c_genericize (fndecl0x7ffff79b2700) at gcc-project/gcc/c-family/c-gimplify.cc:796
#2 0x00000000011587ec in finish_function (end_loc33408) at gcc-project/gcc/c/c-decl.cc:11501
#3 0x00000000011d9734 in c_parser_declaration_or_fndef at gcc-project/gcc/c/c-parser.cc:3010
#4 0x00000000011d680e in c_parser_external_declaration (parser0x7ffff7fbc5b0) at gcc-project/gcc/c/c-parser.cc:2088
#5 0x00000000011d6254 in c_parser_translation_unit (parser0x7ffff7fbc5b0) at gcc-project/gcc/c/c-parser.cc:1952
#6 0x000000000123cf9e in c_parse_file () at gcc-project/gcc/c/c-parser.cc:29613
#7 0x00000000012f68c8 in c_common_parse_file () at gcc-project/gcc/c-family/c-opts.cc:1379
#8 0x0000000001bd64d3 in compile_file () at gcc-project/gcc/toplev.cc:452
#9 0x0000000001bd9b1e in do_compile () at gcc-project/gcc/toplev.cc:2200
#10 0x0000000001bd9fb9 in toplev::main (this0x7fffffffd3d2, argc19, argv0x7fffffffd518) at gcc-project/gcc/toplev.cc:2354
#11 0x0000000004482a35 in main (argc19, argv0x7fffffffd518) at gcc-project/gcc/main.cc:39cgraph_node::get_create 就是对于一个解析后的函数所构建的调用图中的节点调用节点cgraph_node。 由此可见符号表Symbol Table会包含整个转译单元中的符号对于函数的话会形成对应的调用节点cgraph_nodesymtab_node。 此时加入以调用节点加入到符号表中的函数是已经解析好以GENERIC 中间语言所表示的。 加入后cc1 调用 cgraph_node::finalize_function 进一步处理。如下图所描述的。 这里关键是说明 C 源代码在解析Parse后所存在的形式如何提供到后面基于过程Pass机制的处理。 那么此时在compile_file函数中如下图 经过 lang_hooks.parse_file (); 后gcc 已经将C的源代码解析完毕Parsed并以调用图的方式存放符号表Symbol Table中。 在接着的 symtab-finalize_compilation_unit (); 就开始通过以处理过程Passes的方式将GENERIC中间语言转换成最终的汇编语言。