当前位置: 首页 > news >正文

GCC 编译器套件说明

写在前面:

本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。


目录

  • GCC 简述
  • GCC 主要构成
  • ARM 编译工具链
  • 基于 GCC 的 ARM 编译工具链提供商
    • Arm GNU Toolchain
    • Linaro Toolchain
  • Reference

GCC 简述

The GNU Compiler Collection,通常简称 GCC ,是一套由 GNU 开发的编译器集合。

为什么是编辑器集合而不是编译器呢?

那是因为 GNU 编译器集合包括 C、C++、Objective-C,Fortran,Ada、Go 和 D 等,以及这些语言的库 (libstdc++,…)。 GCC 最初是作为 GNU 操作系统的编译器编写的。 GNU 系统被开发为 100% 的自由软件 ,即从某种意义上说它是自由的,尊重用户的自由。另外 GCC 对硬件平台的支持,可以说无所不在,它不仅支持 x86 处理器架构, 还支持 ARM, Motorola 68000, Motorola 8800,AtmelAVR,MIPS 等处理器架构。


GCC 主要构成

  1. gcc-core:顾明之意是 GCC 的核心部分,这部分是只包含 c 的编译器及公共部分,而对其他语言(C++、Ada 等)的支持包需要另外安装,这也是 GCC 为何如此强大的重要原因 。gcc-core 依赖于 Binutils。
  2. Binutils:它是一组开发工具,包括连接器,汇编器和其他用于目标文件和档案的工具。关于 Binutils 的介绍可以参考官方的 Binutils 介绍。这个软件包依赖于不同的目标机平台,因为不同目标机的指令集是不一样的,比如 arm 跟 x86 就不一样。
    常用的工具有:
    • as:汇编器,把汇编语言代码转换为机器码(目标文件)。
    • ld:链接器,把编译生成的多个目标文件组织成最终的可执行程序文件。
    • readelf:可用于查看目标文件或可执行程序文件的信息。
    • objcopy: 可用于目标文件格式转换,如 .elf 转换成 .bin
    • objdump:可用于查看目标文件的信息,最主要的作用是反汇编。
    • addr2line:可用于将程序指令地址转换为所对应的函数名、以及函数所在的源文件名和行号。
  3. Glibc:包含了主要的 c 库,这个库提供了基本的例程,用于分配内存,搜索目录,读写文件,字符串处理等等。

ARM 编译工具链

编译器主要用来编译源文件,而在编译一个源文件时需要经过以下 4 步:

  1. 预处理:为把头文件的代码、宏之类的内容转换成生成的 .i 文件,还是 C 代码。
  2. 编译:把预处理后的 .i 文件通过编译成 .s 文件,汇编语言。
  3. 汇编:将汇编语言文件生成目标文件 .o 文件,机器码。
  4. 链接:将每个源文件对应的 .o 文件链接起来,就生成一个可执行程序文件。

交叉编译器:如果我们希望编译器运行在 x86 架构平台上,然后编译生成 ARM 架构的可执行程序,这种编译器和目标程序运行在不同架构的编译过程,被称为 “交叉编译”,而对应使用的编译工具就成为交叉编译器。

GNU 交叉编译器的命名规则:

arch [-vendor] [-os] [-(gnu)abi] [-language]

  • arch:体系架构,如 armaarch64 或者 mips 等;
  • vendor:工具链提供商,没有 vendor 时,用 none 代替;
  • os:目标操作系统,没有 os 支持时,用 none 代替;
  • abi:应用二进制接口(Application Binary Interface),对于嵌入式平台命名为 eabie 表示 Embedded;
  • language:编译器支持的语言,如:gccg++

note:如果同时没有 vendor 和 os 支持,则只用一个 none 代替。例如 arm-none-eabi 中的 none 表示既没有 vendor 也没有 os 支持。

关于 ABI 和 EABI 的区别

ABI:应用二进制接口(Application Binary Interface)。在计算机中,应用二进制接口描述了应用程序(或者其他类型)和操作系统之间或其他应用程序的低级接口。

EABI:嵌入式应用二进制接口(Embedded Application Binary Interface)。嵌入式应用二进制接口指定了文件格式、数据类型、寄存器使用、堆积组织优化和在一个嵌入式软件中的参数的标准约定。开发者使用自己的汇编语言也可以使用 EABI 作为与兼容的编译器生成的汇编语言的接口。

两者主要区别是:ABI 是计算机上的,EABI 是嵌入式平台上(如 ARM,MIPS 等)的;EABI 去掉了用户代码和系统内核之间的抽象,可以让用户代码直接访问硬件,提高了性能。

关于 gcc 和 g++ 的区别

实际上,只要是 gcc 编译器支持的语言都可以使用 gcc 编译器完成编译,而 g++ 编译器只会按照 C++ 的风格编译代码。虽然很多情况下我们都认为 C++ 是对 C 语言兼容的,但是实际上在一些具体的语法规则上,C++ 在编译过程中的语法检查会更加严格。此外,C++ 语言本身在编译 过程中也会引入 C++ 的标准库,如果使用 gcc 编译器直接编译 C++ 语言会在编译过程中添加额外的参数,这样会显得编译过程较为繁琐(因为大部分情况下我们希望标准库可以直接引入,而不是再需要手动指定,否则对于初级使用者会带来额外的学习负担)。为了更方便使用编译器,我们选择 g++ 来编译 C++ 代码。总结一下,gcc 可以完成 C++ 语言的编译,但是使用过程会较为繁琐,而 g++ 就是简化后的编译指令。

与 gnueabi 相关的 gnueabi 和 gnueabihf 的区别

gcc-arm-linux-gnueabi – The GNU C compiler for armel architecture

AND

gcc-arm-linux-gnueabihf – The GNU C compiler for armhf architecture

这两个交叉编译器分别适用于 armel 和 armhf 两个不同的架构,armel 和 armhf 这两种架构在对待浮点运算采取了不同的策略(有 fpu 的 ARM 才能支持这两种浮点运算策略)。

这两个交叉编译器是 gcc 的选项 -mfloat-abi 的默认值不同;该选项有三种值 soft、softfp、hard(其中后两者都要求 ARM 里有 fpu 浮点运算单元,soft 与后两者是兼容的,但 softfp 和 hard 两种模式互不兼容):

  • soft: 不用 fpu 进行浮点计算,即使有 fpu 浮点运算单元也不用,而是使用软件模式。

  • softfp: armel 架构(对应的编译器为 arm-linux-gnueabi-gcc )采用的默认值,用 fpu 计算,但是传参数用普通寄存器传,这样中断的时候,只需要保存普通寄存器,中断负荷小,但是参数需要转换成浮点的再计算。

  • hard: armhf架构(对应的编译器 arm-linux-gnueabihf-gcc )采用的默认值,用 fpu 计算,传参数也用 fpu 中的浮点寄存器传,省去了转换,性能最好,但是中断负荷高。

几种常见的编译 ARM 的交叉编译器:

arm-none-eabi:用于编译裸机程序或系统,这个是没有操作系统的,不支持那些系统调用等系列接口,可调用 newlib 库,适用于 ARM7/Cortex-M/Cortex-R。

arm-none-linux-gnueabi:用于编译 ARM 架构的 u-boot、Linux 内核、Linux 应用等,使用 glibc 库,适用于 ARM9/ARM11/Cortex-A。

arm-eabi: 用于安卓程序编译。

armcc:早期 Keil 软件公司(现已被 ARM 公司收购)出品的支持相应器件的编译工具,可以编译裸机程序,一般和 ARM 开发工具一起,Keil MDK 内置。


基于 GCC 的 ARM 编译工具链提供商

目前,为 ARM 平台提供交叉编译工具链的提供商,本人所找到的只有两家:ARM 官方和 Linaro 公司。

Arm GNU Toolchain

ARM 除了有自己的专用编译器之外,还维护了一套基于 GCC 的交叉编译工具链,被称为 Arm GNU Toolchain。截至于 2022 年,Arm GNU Toolchain 被分为了 A family(GNU Toolchain for the Cortex-A Family) 和 R & M family(GNU Arm Embedded Toolchain)两大类,但是自 2022 年开始,ARM 对其进行了统一。

Linaro Toolchain

Linaro 是一间非营利性质的开放源代码软件工程公司,主要的目标在于开发不同半导体公司系统单片机(SoC)平台的共通软件。其维护的工具链下载地址为:https://snapshots.linaro.org/gnu-toolchain/ 。另外,从 https://www.linaro.org/downloads/ 的描述上看,目前 Linaro 仅针对于 Cortex-A 内核的编译工具链进行维护,而对用于 ARM 嵌入式处理器的 Cortex-R 和 Cortex-M 裸机编译工具链,则需要去 ARM 官网下载!


Reference

https://www.cnblogs.com/xiaotlili/p/3306100.html

https://blog.csdn.net/ZCShouCSDN/article/details/89553323

相关文章:

GCC 编译器套件说明

写在前面: 本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。 目录GCC 简述GCC 主要…...

IDEA集成Git

1:IDEA集合Git1.1:配置Git忽略文件-IDEA特定文件问题 1:为什么要忽略他们?答: 与项目的实际功能无关, 不参与服务器上部署运行。把它们忽略掉能够屏蔽 IDE 工具之间的差异。问题 2:怎么忽略?1&a…...

算法流程图

里程计定位: 优:定位信息连续,无离散的跳跃 缺:存在累计误差,不利于长距或长期定位 传感器定位: 优:比里程计定位更精准 缺:会出现跳变情况,且传感器定位在标志物较少的环…...

Java中安装JDK环境–javac命令无效

Java中安装JDK环境–javac命令无效 一,安装JDK1.8 阿里云盘地址推荐 我们可以选择安装地址,这个地址是我们用来配置环境变量的,唯一注意的是这个,其他的都是默认下一步。直至安装完成,jdk下载地址https://www.oracl…...

递推问题

递推:在面对一个大任务的时候,有时候我们可以将大任务划分为小任务,再将小任务划分为更小的任务......,直到遇到初始情况,最后由初始情况一直往前推进,最后解决大任务,这就是递推的思想。递推问…...

js中强制类型转换Number、parseInt、parseFloat、Boolean、String、toString的使用

文章目录一、Number() 转换为整数二、Number.parseInt() 将字符串转换为整数三、Number.parseFloat() 将字符串转换为浮点数四、Boolean() 转换为布尔值五、String() 转换为字符串六、.toString() 转换为字符串最近在巩固 js 的基础知识,今天复习到了 js 中的数据类…...

漏斗分析法

一什么是漏斗分析? 漏斗分析是数据领域最常见的一种“程式化”数据分析方法,它能够科学地评估一种业务过程,从起点到终点,各个阶段的转化情况。通过可以量化的数据分析,帮助业务找到有问题的业务环节,并进…...

pycharm入门快捷操作(部分)

altenter:提示意图动作shift两次或者crtlshifta:查找框(查找动作、类、项目等)crtlw:一次一个字符、两次整个字符串(if条件下选择整个判断体)、三次整个句子、四次整个引用ctrlshiftw&#xff1…...

宣布 Databricks 支持 Amazon Graviton2,性价比提高3倍

今天,我们很高兴地宣布 Databricks 对基于 Amazon Graviton2 的亚马逊弹性计算云(Amazon EC2)实例的支持的公开预览。Graviton 处理器由亚马逊云科技进行定制设计和优化,为运行在 Amazon EC2 上的云工作负载提供最佳性价比。当与高…...

18_FreeRTOS任务通知

目录 任务通知的简介 任务通知值的更新方式 任务通知的优势 任务通知的劣势 任务通知值和通知状态 发送通知相关API函数 接收通知相关API函数 任务通知模拟信号量实验 任务通知模拟消息邮箱实验 任务通知模拟事件标志组实验 任务通知的简介 任务通知:用来通知任务的…...

【华为OD机试模拟题】用 C++ 实现 - 整理扑克牌(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…...

mysql lesson1

常用命令 1:exit 退出mysql 2:uroot pENTER键,再输入密码,不被别人看见 3:完美卸载:双击安装包,手动删除program file中的mysql,手动删除Programedate里的mysql 4:use mysql 使用数据库 5:…...

联想笔记本无法下载 Lenovo Vantage

状况 在 Microsoft Store 下载时发生错误,可能是如下代码:0x80070005, 0x80073D05, or 0x80070017. 解决方法 1.在“开始”菜单搜索栏中输入PowerShell 2.当Windows PowerShell出现在“开始”菜单中,右键点击此图标,然后选择以…...

功能性材料深入超级赛道,赋能多行业迭代升级

中国国际胶粘剂及密封剂展览会深耕胶粘剂、密封剂和胶粘带行业26年,是行业认可的、优质的贸易与技术交流平台。展会连接了十几个行业的买家和卖家,包括汽车、电子、新能源、轨道交通、工业等重要领域,为客户提供封装、粘合、散热、装配制造等…...

【项目精选】jsp企业快信系统(论文+视频+源码)

点击下载源码 计算机网络的出现到现在已经经历了翻天覆地的重大改变。因特网也从最早的供科学家交流心得的简单的文本浏览器发展成为了商务和信息的中心。到了今天,互联网已经成为了大量应用的首选平台,人们已经渐渐习惯了网络交易,渐渐对网络…...

通信算法之112:载波同步及comm.CarrierSynchronizer

1. 2. 载波同步是基于锁相环技术使本地获取和载波同频同相的参考信号,用来解调信号。载波同步就是对本地参考信号进行频率和相位偏差的补偿,进而实现本地参考信号和载波信号同频同相。 载波同步只适用于单载波调制系统,载波同步算法对于BPSK、…...

【C. Build Permutation】(整数理论、构造、思维)

链接 理论基础 结论:在区间[n,2n]上,至少存在一个完全平方数。结论:在区间[n,2n]上,至少存在一个完全平方数。结论:在区间[n,2n]上,至少存在一个完全平方数。 构造⌈n⌉2构造\lceil \sqrt{n}\rceil^2构造⌈…...

前端面试题:事件循环(Eventloop)

什么是事件循环?如何理解事件循环?事件循环原理如何描述?事件循环涉及了很多知识点,想要彻底掌握JS事件循环原理必须要掌握以下知识点:同步任务、异步任务、宏任务、微任务、任务队列、执行栈、js运行机制、EventLoop。 1.事件循…...

jmeter接口自动化测试框架

接口测试可以分为两部分: 一是线上接口(生产环境)自动化测试,需要自动定时执行,每5分钟自动执行一次,相当于每5分钟就检查一遍线上的接口是否正常,有异常能够及时发现,不至于影响用…...

树莓派CM4基础设置

安装系统1.1 软件和硬件准备硬件:CM4(4GB DDR32GB EMMC 板载WIFI和蓝牙)CM4-to-Pi4-Adapter软件:Raspberry Pi或者 Win32DiskImagerRaspberry Pi下载链接:点击直接下载Win32DiskImager下载链接:链接&#x…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...

MeshGPT 笔记

[2311.15475] MeshGPT: Generating Triangle Meshes with Decoder-Only Transformers https://library.scholarcy.com/try 真正意义上的AI生成三维模型MESHGPT来袭!_哔哩哔哩_bilibili GitHub - lucidrains/meshgpt-pytorch: Implementation of MeshGPT, SOTA Me…...