gcc 源码阅读---程序入口

GCC源码分析(一) — 输入参数解析 只以编译阶段为例的话,gcc的参数解析分为两部分: 一部分是参数从命令行到gcc 一部分是参数从gcc到最终的编译程序cc1 1.从命令行到gcc 编译出来的gcc二进制程序实际上只是起到一个桩代码的作用,或者说只是一个编译的驱动,其内部实际上是要分别调用cc1,as,collect来进行编译,汇编与连接。gcc的基本流程如下图: gcc在解析了输入参数后,会为每一个输入文件启动一次cc1来做具体的编译,而cc1一次只能处理一个源码的编译,如果输入多... 阅读详情

在gcc 默认编译中,会编译出gcc/g++,cc1这几个程序,

gcc 是个驱动型程序,完成c/c++转为汇编程,调用汇编程序转为.o文件,再调用link程序生成elf执行程序

cc1程序是真正的将c编译为汇篇程序,这是整个编译的核 心

gcc 入口:

gcc_main.c 

                

int
main (int argc, char **argv)
{
  driver d (false, /* can_finalize */
        false); /* debug */

  return d.main (argc, argv);
}
最后调用gcc.c

driver::main (int argc, char **argv)

cc1 入口

main.cc

int
main (int argc, char **argv)
{
  toplev toplev (NULL, /* external_timer */
         true /* init_signals */);

  int r = toplev.main (argc, argv);

  if (flag_checking && !seen_error ())
    toplev.finalize ();

  return r;
}
最后调用 toplev.cc

int
toplev::main (int argc, char **argv)
{
  /* Parsing and gimplification sometimes need quite large stack.
     Increase stack size limits if possible.  */
  stack_limit_increase (64 * 1024 * 1024);

  /* Stash a copy of the original argv before expansion
     for use by SARIF output.  */
  unique_argv original_argv (dupargv (argv));

  expandargv (&argc, &argv);

  /* Initialization of GCC's environment, and diagnostics.  */
  general_init (argv[0], m_init_signals, std::move (original_argv));

  /* One-off initialization of options that does not need to be
     repeated when options are added for particular functions.  */
  init_options_once ();
  init_opts_obstack ();

  /* Initialize global options structures; this must be repeated for
     each structure used for parsing options.  */
  init_options_struct (&global_options, &global_options_set);
  lang_hooks.init_options_struct (&global_options);

  /* Init GGC heuristics must be caller after we initialize
     options.  */
  init_ggc_heuristics ();

  /* Convert the options to an array.  */
  decode_cmdline_options_to_array_default_mask (argc,
                        CONST_CAST2 (const char **,
                                 char **, argv),
                        &save_decoded_options,
                        &save_decoded_options_count);

  /* Save Optimization decoded options.  */
  save_opt_decoded_options = new vec<cl_decoded_option> ();
  for (unsigned i = 1; i < save_decoded_options_count; ++i)
    if (save_decoded_options[i].opt_index < cl_options_count
    && cl_options[save_decoded_options[i].opt_index].flags & CL_OPTIMIZATION)
      save_opt_decoded_options->safe_push (save_decoded_options[i]);

  /* Perform language-specific options initialization.  */
  lang_hooks.init_options (save_decoded_options_count, save_decoded_options);

  /* Parse the options and do minimal processing; basically just
     enough to default flags appropriately.  */
  decode_options (&global_options, &global_options_set,
          save_decoded_options, save_decoded_options_count,
          UNKNOWN_LOCATION, global_dc,
          targetm.target_option.override);

  global_dc->get_file_cache ().tune (param_file_cache_files,
                     param_file_cache_lines);

  handle_common_deferred_options ();

  init_local_tick ();

  initialize_plugins ();

  /* Handle the dump options now that plugins have had a chance to install new
     passes.  */
  handle_deferred_dump_options ();

  if (version_flag)
    print_version (stderr, "", true);

  if (help_flag)
    print_plugins_help (stderr, "");

  /* Exit early if we can (e.g. -help).  */
  if (!exit_after_options)
    {
      /* Just in case lang_hooks.post_options ends up calling a debug_hook.
     This can happen with incorrect pre-processed input. */
      debug_hooks = &do_nothing_debug_hooks;
      /* Allow the front end to perform consistency checks and do further
     initialization based on the command line options.  This hook also
     sets the original filename if appropriate (e.g. foo.i -> foo.c)
     so we can correctly initialize debug output.  */
      no_backend = lang_hooks.post_options (&main_input_filename);

      process_options ();

      if (m_use_TV_TOTAL)
    start_timevars ();
      do_compile ();

      if (flag_self_test && !seen_error ())
    {
      if (no_backend)
        error_at (UNKNOWN_LOCATION, "self-tests incompatible with %<-E%>");
      else
        run_self_tests ();
    }
    }

  if (warningcount || errorcount || werrorcount)
    print_ignored_options ();

  /* Invoke registered plugin callbacks if any.  Some plugins could
     emit some diagnostics here.  */
  invoke_plugin_callbacks (PLUGIN_FINISH, NULL);

  if (auto edit_context_ptr = global_dc->get_edit_context ())
    {
      pretty_printer pp;
      pp_show_color (&pp) = pp_show_color (global_dc->get_reference_printer ());
      edit_context_ptr->print_diff (&pp, true);
      pp_flush (&pp);
    }

  diagnostic_finish (global_dc);

  finalize_plugins ();

  after_memory_report = true;

  if (global_dc->execution_failed_p ())
    return (FATAL_EXIT_CODE);

  return (SUCCESS_EXIT_CODE);
}

GCC源码分析(一)——介绍与安装 上半年一直在做有关GCC和LD的项目,到现在还没做完。最近几天编程的那台电脑坏了,所以趁此间隙写一点相关的分析和经验之类的跟大家共享。 一、GCC的作用和运行机制     GCC是Linux下重要的编译工具,用法这里就不说了,满大街都找得到。这里我重点介绍GCC的运作机制,作为代码分析的铺垫。全篇使用C语言子部件来作分析,因为我对其他语言的编译没有研究。     根据编译原理,语言的编译分为 阅读详情

相关推荐

CentOS下源码安装GCC 5.2.0

今天开始研读c++ primer fifth edition, 这本书遵循了C++11标准,很多新特性需要GNU compiler 4.7.0之后才支持,而CentOS6通过yum最多只能升到4.4.7,这就必须源码安装GCC了。废话不多说,首先下载源码包:wget http://mirrors-usa.go-parts.com/gcc/releases/gcc-5.2.0/gcc-5.2.0.ta

jnuyanfa的博客 2756

编译gcc源码

编译gcc源码

咯咯哒 4300

gcc 源码阅读---语法树

GCC语法树节点类型定义摘要 GCC编译器在tree.def文件中定义了丰富的语法树节点类型,涵盖编译器前端到后端处理的各类语法结构。主要分类包括: 基础节点类:ERROR_MARK、IDENTIFIER_NODE等异常标记节点 类型节点:INTEGER_TYPE、POINTER_TYPE等30+种数据类型 常量节点:INTEGER_CST、REAL_CST等10+种常量类型 声明节点:FUNCTION_DECL、VAR_DECL等20+种声明类型 表达式节点:包含算术运算(PLUS_EXPR)、比较运算(

825

从GCC源码分析C语言编译原理——获取gcc源码

之前一直想自己发明一个新语言并配套搞个编译器来着,想了很久发现不太可行,付出与回报不成正比,也没法推广,现在没有一个新的语言的生存环境。所以就通过gcc的原理去对编译原理做加深性的学习吧。GCC(GNU Compiler Collection)是一个广泛使用的编译器集合,支持多种编程语言,如C、C++、Fortran等。

qq_52479948的博客 2487

GCC 编译器----通史

计算机软件作为人类的知识财富,为人类社会的发展起到了巨大的作用,但长期以来软件源码作为个人或公司的私有财产受到严格的保密,很难做到像文学艺术作品一样地进行公开的交流,很大程度上造成软件的低水平,重复劳动严重,在一定意义上制约了软件的发展。 文章目录1. GPL与GNU2. GCC发展史3. GCC所支持的平台4. GCC的组成部分以及使用到的软件5. GCC编译C语言程序6. GCC编译流程7....

qq_22613757的博客 1675

gcc源码阅读--gimple 介绍

摘要:GENERIC是一种规范化的AST表示形式,旨在建立与前端语言无关的统一AST标准。在GCC编译器中,前端语言通常会将AST/GENERIC转换为GIMPLE中间表示。GIMPLE是一种三地址码形式的语言无关中间表示,相比树形结构的AST/GENERIC,它具有线性序列的特点,更利于后续编译优化。从AST到GIMPLE的转换包含高级GIMPLE和低级GIMPLE两个阶段,最终会消除作用域等相关语句,形成更简洁的中间表示形式。这一转换过程实现了从语言相关到语言无关的过渡,为编译器后端处理提供了统一基础。

633

GCC源码

1、下载gcc源码包 Download (HTTP): http://ftp.gnu.org/gnu/gcc/gcc-4.9.2/gcc-4.9.2.tar.gz

Webster_WXH的博客 1797

GCC编译原理实战:源码到可执行程序的转变

GCC(GNU Compiler Collection,GNU编译器集合)是一个编译器的集合,它能够处理多种编程语言,包括但不限于C、C++、Objective-C、Fortran、Ada和Go等。GCC以其开源和跨平台的特性,成为自由软件运动的一个重要部分,广泛用于Linux及其他类Unix系统,以及各种嵌入式设备中。GCC的核心优势在于其强大的兼容性和优化能力。它支持广泛的编译选项,开发者可以根据不同的需求选择不同的优化级别,从简单的代码检查到复杂的性能调优。

weixin_42613018的博客 548

Linux纯命令行以源码编译安装gcc(2024年2月5日)

欢迎阅读这篇关于在Linux系统中从源码编译安装GCC 13的详细指南。GCC(GNU Compiler Collection)作为一个强大的编译器集合,对于开发者来说是至关重要的工具之一。在这篇文章中,我们将探讨如何通过纯命令行的方式,从源代码构建并安装最新版本的GCC 13。为什么选择源码编译?源码编译不仅能够让我们获得最新的GCC版本,还允许我们在系统中灵活地配置和使用编译器。通过深入了解每个步骤,读者将能够更好地理解GCC的安装过程,并根据自己的需求进行定制。

m0_73062333的博客 1万+

保姆级教程如何进行本地局域网布署openclaw小龙虾

全网唯一一篇一步步实战教程,图文并茂方式的方式教你如何本地部署安装小龙虾openclaw

zzw17wei的专栏 1467

WGCNA分析中那些没人告诉你的坑:以肺结核差异基因模块筛选为例

本文深入探讨WGCNA分析在肺结核差异基因模块筛选中的七个关键陷阱,包括soft-thresholding选取、样本离群值检测、模块合并阈值调整等。通过实际案例和R代码示例,揭示生信数据挖掘中常被忽视的技术细节,帮助研究者避免常见错误,提升分析结果的可靠性和生物学意义。

weixin_29218509的博客 261

linux编译gcc源码,源码安装gcc各种情况的解决

现在很多程序员都应用GCC,怎样才能更好的应用GCC。目前,GCC可以用来编译C/C++、FORTRAN、JAVA、OBJC、ADA等语言 的程序,可根据需要选择安装支持的语言。本文以在Redhat Linux安装GCC4.1.2为例(因在项目开发过程中要求使用,没有用最新的GCC版本),介绍Linux安装GCC过程。安装之前,系统中必须要有cc或者gcc等编译器,并且是可用的,或者用环境变量CC...

weixin_39641103的博客 1791

公文流转系统

公文录入区 | QLineEdit(文号/标题)、QComboBox(公文类型/紧急程度)、QTextEdit(正文)、QListWidget(附件列表)、QPushButton(上传附件/保存草稿/提交审批) |// 按时间范围获取。QStringList userNames = {"张三", "李四", "王五", "赵六", "钱七", "孙八", "周九", "吴十", "郑十一", "王十二"};

寒寒豆豆软件公司的博客 550

一个超级实用的源码阅读小技巧

大家好,我是小麦。在学习编程的路途漫漫,优秀的源码是非常珍贵的学习资源,阅读源码也是有效提高自己的一个好方法。工欲善其事必先利其器;我发现函数调用图可以让我们更加直观地了解到源码函数直接的...

一名热爱技术的工程师的博客。分享技术干货,记录美好生活。永远相信美好的事情即将发生。 1924

小秋SLAM入门实战ubuntu所有文章汇总

ubuntu 终端如何停止快速打印的输出以及恢复命令 ubuntu 终端如何快速打开当前路径下的图形化窗口界面? killall -9用途用法 ps -xu | grep这个命令的用途 linux 下 top命令显示的是内存是堆内存吗? zip分割和合并 关闭除当前 GNOME 终端窗口以外的所有其他 GNOME 终端窗口 如何在安装系统后设置短密码 【如何使用getrusage获取消耗的CPU时间和进程使用的最大物理内存】 【webots安装使用教程】 Linux系统下查看当前运行的进程和线程的几种方法

小秋 AI SLAM 入门实战教程 1401

uniapp(vue3):实现手机拍照或相册图片上传后给图片添加水印,uniapp实现多端图片上传、拍照上传自定义插入水印内容,调用手机摄像头打开相机并在周围悬挂自定义水印(支持文字水印/图片水印等)

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,uni-app为图片添加自定义水印(解决生成图片不全问题),uniapp上传图片添加水印,uniapp H5实现手机拍照或相册上传图像并添加自定义水印,uniapp水印相机,uni-app为图片添加自定义水印,怎么在图片上加水印,图片水印,上传照片带水印,从相册选择图片加水印功能,拍完照片给图片加水印,添加照片水印,uniapp图片加水印,为图片添加自定义水印,uni-app上传图片并添加水印,上传图

✅ 精选推荐文章 3263

科普文:软件架构数据库系列之【MySQL源码阅读小技巧】

开源软件已经广泛的被互联网公司所应用,不仅仅是因为其能给企业节省一大笔成本,而且最重要的是拥有更多的自主可控性,能从源头上对软件质量进行把控。另一方面,由于开源软件背后往往没有大型的商业公司,所以文档相对来说不是非常完善(或者说文档和代码不一定相互对应),因此,作为一名合格程序员,尤其是基础软件开发的程序员,阅读源码的能力是必备的素质。

为无为,事无事,味无味。 1542

某易将军令口令纯算法还原py篇

算法开源,将军令口令算法。希望官方多多更新吧

任雪飘的博客 3909

gcc源码阅读--语法解析

这篇文章分析了GCC编译器前端语法解析的核心流程,主要包含以下内容: 语法解析入口函数c_common_parse_file,负责初始化预处理并循环处理每个输入文件 解析单个源文件的c_parse_file函数,处理PCH预编译头文件并初始化异常处理 解析翻译单元(translation unit)的c_parser_translation_unit函数,处理外部声明和GNU扩展语法 解析外部声明(declaration/definition)的c_parser_external_declaration函数

714

C#【通用方法】字节数组添加、移除、获取的方法类(妙用List<byte>,开发中常用)

C#【通用方法】添加移除字节的方法类(妙用List,开发中常用)

星Yeah 的博客 3358

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

使用源码安装gcc 9.2.0

安装之前,系统中必须要有cc或者gcc等编译器,并且是可用的,或者用环境变量CC指定系统上的编译器。如果系统上没有编译器,不能安装源代码形式的GCC 9.2.0。如果是这种情况,可以在网上找一个与你系统相适应的如RPM等二进制形式的GCC软件包来安装使用。本文介绍的是以源代码形式提供的GCC软件包的安装过程,软件包本身和其安装过程同样适用于其它Linux和Unix系统。 1 下载 在GC...

lucboll的博客 9231

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Ubuntu1804 源码阅读神器,egypt+graphviz 图形化显示函数调用关系(超详细+图文并茂)

函数调用图可以让我们更加只管了解到源码函数直接的调用和层次关系,提高阅读源码的效率,工欲善其事,必先利其器;

一名热爱技术的工程师的博客。分享技术干货,记录美好生活。永远相信美好的事情即将发生。 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

gcc 源码阅读--C语言预处理

此hash桶是自动扩展的,在ht搜索函数ht_lookup_with_hash中,若发现整个hash table超过3/4都满了,就会主动扩展此hash table(重新分配,复制,释放原有的)。alloc_node函数是用来分配节点内存的,分配后hashnode[]数组中的指针,也就指向这个内存中的元素,在ht搜索过程中(ht_lookup_with_hash),若发现需要新。/* 当前正在处理的语法符号c_token的地址,这里除了初始化时,应该指向 tokens_buf[0] */

615

linux 内核代码阅读工具,linux内核源码阅读工具

一 linux内核源码阅读工具windows下当然首选source insight, 但是linux下就没有sourceinsight这么优秀的工具了,但是也有不少的替代品,但觉绝对部分人会选择vim+ctags+cscope的组合,还有部分人或选择wine中的sourceinsight或选择navigatror,当然对于代码阅读来说vim+ctags+cscope的组合还是比较好的一个选择方案,...

weixin_42306002的博客 1990

LINUX源码阅读方法

LINUX内核源代码可以从很多途径得到。一般来讲,在安装的linux系统下,/usr/src/linux目录下的东西就是内核源代码。另外还可以从互连网上下载,解压缩后文件一般也都位于linux目录下。内核源代码有很多版本,目前最新的版本是2.2.14。 许多人对于阅读Linux内核有一种恐惧感,其实大可不必。当然,象Linux内核这样大而复杂的系统代码,阅读起来确实有很多困难,但是也不象想象 的

bruce0532的专栏 3150
上一篇: MFC 中创建并显示二维码
下一篇: gcc 源码阅读--C语言预处理
GoldKey
博客等级 码龄25年 82粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GoldKey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值