GCC详解-总览

2023-11-06

1、GCC是什么

早期 GCC 的全拼为 GNU C Compiler,即 GUN 计划诞生的 C 语言编译器,显然最初 GCC 的定位确实只用于编译 C 语言。


但经过这些年不断的迭代,GCC 的功能得到了很大的扩展,它不仅可以用来编译 C 语言程序,还可以处理 C++、Go、Objective -C 等多种编译语言编写的程序。


与此同时,由于之前的 GNU C Compiler 已经无法完美诠释 GCC 的含义,所以其英文全称被重新定义为 GNU Compiler Collection,即 GNU 编译器套件。

其官方网站为:https://gcc.gnu.org/

2、GCC的组成

GCC由如下三部分组成:

Gcc-Core:GCC编译器,完成预处理和编译过程
Binutils:包括了链接器ld,汇编器as,目标文件格式查看器readelf等一系列小工具
glibc:C语言标准库

2.1 GCC-Core

名称 介绍
c++

gcc 的一个版木,默认语言设置为 C++,而且在连接的时候自动包含标准 C++ 库。

这和 g++ 一样

ccl 实际的C编译程序
cclplus 实际的 C++ 编泽程序
collect2 在不使用 GNU 连接程序的系统上,有必要运行 collect2 来产生特定的全局初始化代码(例如 C++ 的构造函数和析构函数)
configure GCC 源代码树根目录中的一个脚木。用于设置配置值和创建GCC 编译程序必需的 make 程序的描述文件
crt0.o 这个初始化和结束代码是为每个系统定制的,而且也被编译进该文件,该文件然后会被连接到每个可执行文件中来执行必要的启动和终止程序
cygwin1.dll Windows 的共享库提供的 API,模拟 UNIX 系统调用
f77 该驱动程序可用于编译 Fortran
f771 实际的 Fortran 编译程序
g++ gcc 的一个版木,默认语言设置为 C++,而且在连接的时候自动包含标准 C++ 库。这和 c++ 一样
gcc 该驱动程序等同于执行编译程序和连接程序以产生需要的输出
gcj 该驱动程序用于编译 Java
gnat1 实际的 Ada 编译程序
gnatbind 一种工具,用于执行 Ada 语言绑定
gnatlink 一种工具,用于执行 Ada 语言连接
jc1 实际的 Java 编译程序
libgcc 该库包含的例程被作为编泽程序的一部分,是因为它们可被连接到实际的可执行程序中。 它们是特殊的例程,连接到可执行程序,来执行基木的任务,例如浮点运算。这些库中的例程通常都是平台相关的
libgcj 运行时库包含所有的核心 Java 类
libobjc 对所有 Objective-C 程序都必须的运行时库
libstdc++ 运行时库,包括定义为标准语言一部分的所有的 C++ 类和函数

2.2 Binutils

名称 介绍
addr2line 给出一个可执行文件的内部地址,addr2line 使用文件中的调试信息将地址翻泽成源代码文 件名和行号。
ar 这是一个程序,可通过从文档中增加、删除和析取文件来维护库文件。通常使用该工具是为了创建和管理连接程序使用的目标库文档。
as GNU 汇编器。实际上它是一族汇编器,因为它可以被编泽或能够在各种不同平台上工作。 
autoconf 产生的 shell 脚木自动配置源代码包去编泽某个特定版木的 UNIX
c++filt 程序接受被 C++ 编泽程序转换过的名字(不是被重载的),而且将该名字翻泽成初始形式。 
f2c 是 Fortran 到C的翻译程序。不是 GCC 的一部分
gcov gprof 使用的配置工具,用来确定程序运行的时候哪一部分耗时最大
gdb GNU 调试器,可用于检查程序运行时的值和行为
GNATS GNU 的调试跟踪系统(GNU Bug Tracking System)。一个跟踪 GCC 和其他 GNU 软件问题的在线系统
gprof 该程序会监督编泽程序的执行过程,并报告程序中各个函数的运行时间,可以根据所提供 的配置文件来优化程序。
ld GNU 连接程序。该程序将目标文件的集合组合成可执行程序。
libtool 一个基本库,支持 make 程序的描述文件使用的简化共享库用法的脚木
make 一个工具程序,它会读 makefile 脚木来确定程序中的哪个部分需要编泽和连接,然后发布 必要的命令。它读出的脚木(叫做 makefile 或 Makefile)定义了文件关系和依赖关系
nlmconv 将可重定位的目标文件转换成 NetWare 可加载模块(NetWare Loadable Module, NLM)。
nm 列出目标文件中定义的符号。
objcopy 将目标文件从一种二进制格式复制和翻译到另外一种。
objdump 显示一个或多个目标文件中保存的多种不同信息。
ranlib 创建和添加到 ar 文档的索引。该索引被 Id 使用来定位库中的模块。
ratfor Ratfor 预处理程序可由 GCC 激活,但不是标准 GCC 发布版的一部分
readelf 从 ELF 格式的目标文件显示信息。
size 列出目标文件中每个部分的名字和尺寸。
strings 浏览所有类型的文件,析取出用于显示的字符串。
strip 从目标文件或文档库中去掉符号表,以及其他调试所需的信息。
vcg Ratfor 浏览器从文木文件中读取信息,并以图表形式显示它们。而 vcg 工具并不是 GCC 发布中的一部分,但 -dv 选项可被用来产生 vcg 可以理解的优化数据的格式
windres Window 资源文件编泽程序。

2.3 glibc

我们之前有详细介绍过了,可以参考另外两个博文:

https://blog.csdn.net/sjwangjinbao/article/details/118657631

https://blog.csdn.net/sjwangjinbao/article/details/118684189

3、参考

http://c.biancheng.net/view/679.html

https://zhuanlan.zhihu.com/p/351841622

=========================================================================

注意:本文为本人原创,版权所属为个人所有,欢迎转载,但是转载请注明出处。

=========================================================================

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GCC详解-总览 的相关文章

  • Docker容器内的动态监听端口

    我有一个应用程序 在使用其默认端口建立一些连接后 开始打开 侦听 新的随机端口来处理现有连接 然后删除它们 视频通话 它还在通信协议内交换其IP地址和端口 我能够解决IP地址问题 但仍然无法找到一种方法来动态告诉主机的IPTABLES在Do
  • 如何在 Linux 中制作一个将文件转换为大写的 x86 汇编程序?

    我找到了一个名为 ProgrammingGroundUp 1 0 booksize pdf 的 pdf 文件 其中一个项目是制作一个汇编程序 该程序接收文件并将其转换为大写 section data CONSTANTS system cal
  • 在 Bash 中使用“$RANDOM”生成随机字符串

    我正在尝试使用 Bash 变量 RANDOM创建一个由包含整数和字母数字的变量中的 8 个字符组成的随机字符串 例如 var abcd1234ABCD 我怎样才能做到这一点 使用参数扩展 chars 是可能的字符数 是模运算符 chars
  • 如何在 .zip 文件中使用 grep

    有 3 个文件 a csv b csv c csv 压缩为 abh zip 现在可以在 abh zip 上执行 grep 命令 是否有任何通配符 仅对里面的 c csv 文件运行 grep压缩 如果你有zipgrep 据我所知 它是随zip
  • 仅为我自己禁用和重新启用地址空间布局随机化

    我想在我的系统 Ubuntu Gnu Linux 2 6 32 41 server 上禁用地址空间布局随机化 ASLR 但是 如果我使用 sysctl w kernel randomize va space 0 我认为这一更改将影响系统上的
  • 是否可以为我的 Linux 函数复制命令的制表符补全?

    假设我有一个名为的 bash shell 函数magic 我想定义一个制表符补全功能 magic这将允许magic搭载任何给定命令的选项卡完成功能 如果可用 换句话说 我想要magic能够做这样的事情 magic git
  • 未找到 DEADLINE 调度策略

    我想在 C 中实现 DEADLINE 调度策略 我知道该功能已实现Linux 3 14 10我正在使用 Ubuntu 14 04Linux 3 17 0 031700 lowlatency 201410060605 SMP PREEMPT这
  • 检测后台操作

    在C中 检测程序在 后台模式 下调用的方法是什么 我有一个程序想要以交互方式或在后台启动 我怎样才能检测到我不应该从标准输入读取并以 已停止 tty 输入 状态结束 我应该测试 stdin 是否已关闭 我怎样才能做到这一点 编辑 isatt
  • 是否有一种异步信号安全的方式来读取 Linux 上的目录列表?

    SUSv4 http pubs opengroup org onlinepubs 9699919799 functions V2 chap02 html tag 15 04 03 03未在其异步信号安全函数列表中列出 opendir rea
  • Linux 从设备本身运行的脚本卸载设备

    我在路径中安装了一个 iso 映像 mnt iso 在这个 iso 中我有一个安装脚本 install sh 我从 iso 运行安装脚本 最后脚本询问用户是否要卸载 iso 本身 如果用户按 y 脚本将执行以下代码 cd umount mn
  • “设置:非法选项 -”在一台主机上,但在另一台主机上则不然

    我在我的一台 ubuntu 虚拟机中编写了一个 sh 脚本 该脚本工作正常 但是当我尝试在其他虚拟机中运行它时 它不起作用 两个虚拟机应该相同 和bash version两个虚拟机均回复 GNU bash version 4 3 11 1
  • 您会为 Linux 推荐哪种甘特图/项目管理工具? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我需要一个可在 Linux 中运行并具有甘特图的项目管理工具 它不一定是免费的 只是不贵 我不在乎它如何存储我提供的信息 只要我可以访问它即可 我一定
  • 如何在 Linux 中隐藏 wget 输出? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我不想在使用时看到任何消息wget 我想抑制它通常在屏幕上产生的所有输出 我该怎么做 你为什么不使用 q From man wget q
  • 如何在 Linux/Unix 上根据文件类型添加文件扩展名?

    这是一个关于 Unix shell 脚本 任何 shell 的问题 但任何其他 标准 脚本语言解决方案也将受到赞赏 我有一个充满文件的目录 其中文件名是这样的哈希值 fd73d0cf8ee68073dce270cf7e770b97 fec8
  • 结束 perl 脚本而不等待系统调用返回

    我在 Linux Ubuntu 14 04 上运行一个简单的 apache Web 服务器 并使用 perl CGI 脚本处理一些请求 该脚本使用以下命令启动系统命令system函数 但我希望它立即返回 无论系统调用的结果如何 我一直在传递
  • 从 S3 存储桶下载 300 万个对象的最快方法

    我尝试过使用 Python boto 多处理 S3cmd 和 J3tset 但都在努力解决 有什么建议 也许是您一直在使用的现成脚本或我不知道的其他方式 EDIT eventlet boto 是一个有价值的解决方案 如下所述 在这里找到了一
  • 使用 EOF 在未命名管道上发出信号

    我有一个测试程序 它使用使用 pipeline 创建的无名管道在 Linux 系统上使用 fork 创建的父进程和子进程之间进行通信 通常 当发送进程关闭管道的 write fd 时 接收进程从 read 返回值为 0 表示 EOF 然而
  • Linux:如何调试 SIGSEGV?如何追踪错误源?

    我的火狐浏览器从今天开始崩溃了 我没有更改系统或 Firefox 配置上的任何内容 I use strace ff o dumpfile txt firefox来追踪问题 这没什么大帮助 我在两个生成的进程转储中看到了段错误 但我怎样才能t
  • 对V4L2的一个误解

    我在 C 程序中的缓冲区大小方面遇到了一个小问题 我使用 V4L2 从相机中抓取 YUYV 图像 有一个示例here http linuxtv org downloads v4l dvb apis capture example html
  • 无法使用 linux perf 对硬件缓存事件进行采样

    由于某种原因 我无法采样 perf record 硬件缓存事件 perf record e L1 dcache stores a c 100 sleep 5 perf record Woken up 1 times to write dat

随机推荐

  • 冒泡排序、选择排序、堆排序、快速排序、插入排序算法复杂度分析与算法实现(自己总结与转)

    本人比较热衷于算法 也可能工作的原因 最近一直在研究算法 现将各种排序算法总结在一起 以便于查阅与使用 也希望能够帮助学习排序算法的朋友 1 冒泡算法 这是最原始 也是众所周知的最慢的算法了 他的名字的由来因为它的工作看来象是冒泡 C C
  • openFeign使用get请求自动变成post请求

    Feign的一次坑 记一次 项目错误 之前项目写的feign是get请求 然后发现 请求不了 然后发现日志 请求自动变成post 网上翻阅资料发现 说使用对象类型会把请求自动变成post 所以我改post请求就可以了 查阅资料 总结 fei
  • pointnet分割自己的点云数据_基于超点图的大规模点云分割

    本期介绍一篇基于大规模点云的语义分割相关论文 Large scale Point Cloud Semantic Segmentation with Superpoint Graphs 本文提出了针对大规模点云的语义分割的框架 有序的点云是可
  • IOS:修改NavigationController的后退按钮标题

    今天遇到一问题 折腾很久总算搞明白了 问题是 controllerA和controllerB 点击controllerA中的某个按钮 将controllerB push出来 controllerB上的返回按钮的title不是我想要的 想改掉
  • Leetcode[数组] 三数之和 -- 双指针法

    0 题目描述 leetcode原题链接 三数之和 1 排序 双指针解法 class Solution def threeSum self nums List int gt List List int n len nums if not nu
  • JVM系列之内存分配与回收策略

    前言 经过前面几篇文章 我们已经对JVM虚拟机有了个初步认识 也了解了各区域应用哪些收集器 以及每个收集器用哪些收集算法 但是在这一系列过程中 其实就是一个对象的由生到死的过程 那么在这过程中对象是怎么处理它的生命周期的呢 今天我们就来介绍
  • Web项目-Nginx项目部署

    一 Linux网络 1 网络服务 查看当前网络的状态 并启动和停止网络服务 查看ip ifconfig ip addr 修改网卡ip vim etc sysconfig network scripts ifcfg ens33 概要信息如下
  • NS-3的安装及配置

    本教程基于VM Ware 虚拟机上安装的Ubuntu20 04 一 安装 NS 3 本体 准备 安装开始之前建议大家更换一下软件源并更新一下库 这样接下来的安装会块很多 由于安装过程中需要用到一些工具 所以提前准备好 已经安装的直接下一步
  • springboot整合mysql和mongodb双数据源

    因为业务需求 需要在一个项目中同时使用myslq和mongodb数据库 在网上找了好久都没有 只有相同数据库的双数据源 当时就想如果按照相同数据库的双数据源配置分别配置myslq和mongodb 一 先看一下pom文件
  • The type or namespace name ‘****‘ could not be found (are you missing a using directive or an assemb

    引用的类库目标框架不能大于当前项目的目标框架 修改一致后即可正确编译 参考文章 https blog csdn net weixin 34254823 article details 90098028
  • Error : DEP6810 Windowsphone 真机调试错误

    Windows phone 真机调试时遇到如下错误 Error DEP6810 MdilXapCompile exe failed with error code 2001 See log file C Users Documents Vi
  • 小程序用户头像昵称,微信头像昵称填写onChooseAvatar(2022最佳实践uniapp和原生)

    官方调整公告 小程序用户头像昵称获取规则调整公告 解决方案1 如有必要场景需收集用户头像昵称 可在个人中心或设置等页面让用户完善个人资料 解决方案二 官方 微信头像昵称填写 使用方法 头像选择 需要将 button 组件 open type
  • Mac配置$JAVA_HOME

    很奇怪 在新的Mac上安装了JDK 但是并没有自动配置 JAVA HOME 导致有些需要依赖Java环境的软件启动失败 找不到JAVA HOME的路径 我们首先通过echo JAVA HOME命令看 是否配置了JAVA HOME 如果没有输
  • 序列化和反序列化二叉搜索树

    序列化和反序列化二叉搜索树 序列化是将数据结构或对象转换为一系列位的过程 以便它可以存储在文件或内存缓冲区中 或通过网络连接链路传输 以便稍后在同一个或另一个计算机环境中重建 设计一个算法来序列化和反序列化 二叉搜索树 对序列化 反序列化算
  • 解决pycharm安装好后打不开的问题

    你最近应该把带有Visual C 字样的东西卸载了吧 把 Visual C 安装回来就OK了 安装网址 https support microsoft com zh cn help 2977003 the latest supported
  • 树莓派4B下opencv3.4.0的安装测试与所有错误处理

    1 opencv3 4 0的下载 可以在树莓派的终端界面通过wegt命令下载 但下载速度可能很慢 终端输入下列代码进行下载 cd home pi Downloads wget https github com Itseez opencv a
  • Erlang数据类型的表示和实现(5)——binary

    binary 是 Erlang 中一个具有特色的数据结构 用于处理大块的 原始的 字节块 如果没有 binary 这种数据类型 在 Erlang 中处理字节流的话可能还需要像列表或元组这样的数据结构 根据之前对这些数据结构 Eterm 的描
  • VI/VIM 键盘图 及常规快捷操作

    一 VI VIM 键盘图 二 模式转换 2 1 一般模式 2 2 编辑模式 2 3 命令模式
  • EasyExcel导出图片到Excel

    EasyExcel导出图片到Excel 需要自己重新写转换器 但是1000张以下导出是没问题的 10000以上会卡顿 有意向的小伙伴可以一起讨论下 如何处理大数量的图片导出到excel import com alibaba excel co
  • GCC详解-总览

    1 GCC是什么 早期 GCC 的全拼为 GNU C Compiler 即 GUN 计划诞生的 C 语言编译器 显然最初 GCC 的定位确实只用于编译 C 语言 但经过这些年不断的迭代 GCC 的功能得到了很大的扩展 它不仅可以用来编译 C