当前位置: 首页 > 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…...

用快马ai快速原型一个永久在线crm网站,验证你的产品思路

最近在验证一个CRM产品的市场可行性,需要快速搭建一个能永久在线的基础原型。传统开发流程从环境搭建到功能实现至少需要一周,而通过InsCode(快马)平台的AI辅助,我用不到半天就完成了核心功能验证。以下是具体实践过程: 明确最小可…...

yuzu模拟器完整配置指南:从零开始打造完美Switch游戏体验

yuzu模拟器完整配置指南:从零开始打造完美Switch游戏体验 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu yuzu是一款功能强大的开源任天堂Switch模拟器,让你在Windows、Linux和Android系统上…...

猫抓:网页资源嗅探与下载的全功能解决方案

猫抓:网页资源嗅探与下载的全功能解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在数字化内容爆炸的时代,网页资源…...

Windows苹果触控板驱动完全指南:5分钟实现原生级触控体验

Windows苹果触控板驱动完全指南:5分钟实现原生级触控体验 【免费下载链接】mac-precision-touchpad Windows Precision Touchpad Driver Implementation for Apple MacBook / Magic Trackpad 项目地址: https://gitcode.com/gh_mirrors/ma/mac-precision-touchpad…...

AWPortrait-Z问题解决:图像模糊、速度慢?常见问题一键搞定

AWPortrait-Z问题解决:图像模糊、速度慢?常见问题一键搞定 1. 快速诊断:你的问题属于哪一类? 在使用AWPortrait-Z生成人像时,最常见的问题可以归纳为三类: 图像质量问题:模糊、失真、细节不足…...

.games 域名重塑数字娱乐边界

在互联网基础设施日益垂直化的今天,域名已不再仅仅是简单的网络地址,它已进化为一种数字资产的视觉锤和品牌战略的先导。在众多的新顶级域名(gTLD)中,“.games”凭借其鲜明的行业属性,正在重构全球游戏开发…...

M2LOrder模型生成Typora风格技术博客:Markdown排版与内容组织

M2LOrder模型生成Typora风格技术博客:Markdown排版与内容组织 不知道你有没有过这样的经历:脑子里有一堆技术想法,打开文档准备写篇博客分享,结果光是调整标题层级、插入代码块、排版表格就耗掉了大半热情。最后内容虽然不错&…...

基于STM32单片机指纹考勤系统签到打卡设计

一、系统介绍 本文介绍了一种基于 STM32 单片机的指纹开锁签到考勤系统。该系统以 STM32F103C8T6 单片机核心板为控制中枢,整合了多个关键模块。用户可根据实际需求选择 2.4 寸或 1.44 寸的 TFT 彩屏,用于清晰地显示系统状态及操作提示信息。可选的无线蓝…...

别再手动算面积了!用ArcGIS 10.6的‘汇总统计’功能,5分钟搞定土地利用数据分析

5分钟掌握ArcGIS 10.6汇总统计:土地利用分析效率提升实战 在城乡规划、生态保护等领域的日常工作中,我们经常需要处理各类空间数据。以某市自然资源局为例,工作人员每月需要统计各行政区不同土地利用类型的面积分布情况。传统做法是将属性表导…...

从灰度世界到边缘检测:4种AWB算法MATLAB实现对比(附完整代码)

从灰度世界到边缘检测:4种AWB算法MATLAB实现对比(附完整代码) 在工业级图像信号处理(ISP)流水线中,自动白平衡(AWB)算法是确保色彩还原准确性的关键技术。不同场景下的色温变化会导致…...