arm-none-eabi-gcc 源码编译 toolchain 构建过程

ARM交叉编译工具链 gcc-arm-none-eabi 交叉编译工具链的命名规则为:arch [-vendor] [-os] [-(gnu)eabi]arch– 体系架构,如ARM,MIPSvendor– 工具链提供商os– 目标操作系统eabi– 嵌入式应用二进制接口(Embedded Application Binary Interface)根据对操作系统的支持与否,ARM GCC可分为支持和不支持操作系统,如arm-none-eabi:这个是没有操作系统的,自然不可能支持那些跟操作系统关系密切的函数,比如fork(2)。 阅读详情

背景

我们采用arm公司的芯片,arm会提供官方支持的编译 toolchain,访问地址:ARM 官网

源码编译的好处,可以客制化一些features,features都是通过宏开关控制,比如arm 的gcc中 针对freertos 砍去了posix,所以需要手动打开posix 开关

gcc-arm-none-eabi 源码编译

下载 解压源码source code

把gcc-arm-none-eabi-6-2019-q3-update-linux.tar.bz2解压出来

图 1
arm-src

How-to-build-toolchain.pdf

ARM 公司已经给了编译的参考文档,最主要的就是搭建可以跑起来的编译gcc的环境
以下,在文档中都有介绍,按照步骤操作

  1. ubuntu的编译环境

最好是ubuntu14.04 以上的版本,也可以是win10 linux 子系统18.04(本人实践环境)

  1. 环境搭建
$ sudo su
$ apt-get install software-properties-common
$ add-apt-repository universe

编辑文本 /etc/apt/sources.list.d/xenial.list

deb http://archive.ubuntu.com/ubuntu xenial main universe
deb-src http://archive.ubuntu.com/ubuntu xenial main universe
deb http://security.ubuntu.com/ubuntu xenial-security main

用来支持支持32bit的包

dpkg --add-architecture i386

更新所有的包

apt-get update

安装生成windows 环境的包

apt-get install -y -t xenial \
gcc-mingw-w64-i686 g++-mingw-w64-i686 binutils-mingw-w64-i686

安装所有的工具包

apt-get -f install -y \
build-essential \
autoconf \
autogen \
bison \
dejagnu \
flex \
flip \
gawk \
git \
gperf \
gzip \
nsis \
openssh-client \
p7zip-full \
perl \
python-dev \
libisl-dev \
scons \
tcl \
texinfo \
tofrodos \
wget \
zip \
texlive \
texlive-extra-utils \
libncurses5-dev
# 退出sudo 权限
exit

进入解压目录下图 1

  1. 编译步骤
    正常OK的步骤如下
./install-sources.sh 
./build-prerequisites.sh
./build-toolchain.sh

注意事项

  1. 整个编译过程十分耗时,所以建议每一步都十分仔细,整个过程最长6.5小时
  2. 官方文档建议体跳过mingw32 的环境包,加快速度,建议跳过
  3. 在win10 的linux 子系统下,必须将源码放置在 ~ 主目录下面自己创建一个toolchain目录下,放在e盘或者d盘其他盘,会导致找不到头文件(猜测,微软linux子系统和windows 本身的文件系统兼容性做的不好)
  4. 编译的时候按照我的步骤加快编译和避开编译其他错误
# 下载 和 解压 依赖包
./install-sources.sh --skip_steps=mingw32
# 下载包的时候,可能会出现 缺少包
# 检查 build-common.sh文件所有安装包的链接和对应版本,缺少的话手动下载放在src目录下

# build-common.sh 中需要下载的依赖包的链接
https://gmplib.org/download/gmp/gmp-6.1.0.tar.bz2
http://www.mpfr.org/mpfr-3.1.4/mpfr-3.1.4.tar.bz2
ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3
http://isl.gforge.inria.fr/isl-0.18
https://downloads.sourceforge.net/project/expat/expat/expat-2.1.1/expat-2.1.1.tar.bz2
https://fossies.org/linux/misc/old/libelf-0.8.13.tar.gz
https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
http://www.zlib.net/fossils/zlib-1.2.8.tar.gz
http://nsis.sourceforge.net/mediawiki/images/a/ad/EnvVarUpdate.7z
https://www.python.org/ftp/python/python-2.7.13.msi
# 再次执行 
./install-sources.sh --skip_steps=mingw32 
./build-prerequisites.sh --skip_steps=mingw32 
# 生成 linux版本 免安装 toolchain 
执行命令 
./build-toolchain.sh \
--skip_steps=mingw32,manual,gdb-with-python,mi
ngw32-gdb-with-python

–skip_steps 就是 所有源码安装依赖包 configure 步骤中配置的参数
mingw32 是跳过 生成32位系统 免安装toolchain
manual 不生成 pdf 和html等说明文档
-gdb- 相关参数跳过所有的gdb调试工具生成
整个过程3小时15分钟
基本上一个源码编译生成的免安装gcc toolchain 可以进行玩耍了

记得盯着编译过程,就知道为什么编译时间这么长了

win10 linux 子系统会打包失败,如图2:output pdf

增加posix gcc编译

因为想拥有支持多线程posix的 gcc,那么上面的gcc 工具features中并没有支持posix,编译报错是合理的
查看编译器支持features 图3
gcc disable-threads

那么需要在支持posix 配置的依赖库的源码中,在./configure 增加参数–enable-threads=posix (默认是 --enable-threads=single 即 --disable-threads)

所以 需要build-toolchain.sh 中将所有 的–disable-threads 替换为 --enable-threads=posix ,让编译器支持 posix threads,修改后再次编译

但是编译后,出现编译报错 图4
posix threads support
编译出错,说明我们的编译器不支持posix,所以需要看具体错误

图4 的错误,指出 在mutls.c 中引用了gthr.h 包含头文件中的gthr-default.h 中的pthread 但是不识别
找到源码:在gcc 源码包中找到gthr.h 注释说明了如何手动修改支持 posix

/* If this file is compiled with threads support, it must
       #define __GTHREADS 1
   to indicate that threads support is present.  Also it has define
   function
     int __gthread_active_p ()
   that returns 1 if thread system is active, 0 if not.

   The threads interface must define the following types:
     __gthread_key_t
     __gthread_once_t
     __gthread_mutex_t
     __gthread_recursive_mutex_t

   The threads interface must define the following macros:

     __GTHREAD_ONCE_INIT
     		to initialize __gthread_once_t
     __GTHREAD_MUTEX_INIT
     		to initialize __gthread_mutex_t to get a fast
		non-recursive mutex.
     __GTHREAD_MUTEX_INIT_FUNCTION
		to initialize __gthread_mutex_t to get a fast
		non-recursive mutex.
		Define this to a function which looks like this:
		  void __GTHREAD_MUTEX_INIT_FUNCTION (__gthread_mutex_t *)
     		Some systems can't initialize a mutex without a
		function call.  Don't define __GTHREAD_MUTEX_INIT in this case.
     __GTHREAD_RECURSIVE_MUTEX_INIT
     __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION
     		as above, but for a recursive mutex.

   The threads interface must define the following static functions:

     int __gthread_once (__gthread_once_t *once, void (*func) ())

     int __gthread_key_create (__gthread_key_t *keyp, void (*dtor) (void *))
     int __gthread_key_delete (__gthread_key_t key)

     void *__gthread_getspecific (__gthread_key_t key)
     int __gthread_setspecific (__gthread_key_t key, const void *ptr)

     int __gthread_mutex_destroy (__gthread_mutex_t *mutex);
     int __gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *mutex);

     int __gthread_mutex_lock (__gthread_mutex_t *mutex);
     int __gthread_mutex_trylock (__gthread_mutex_t *mutex);
     int __gthread_mutex_unlock (__gthread_mutex_t *mutex);

     int __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *mutex);
     int __gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *mutex);
     int __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *mutex);

   The following are supported in POSIX threads only. They are required to
   fix a deadlock in static initialization inside libsupc++. The header file
   gthr-posix.h defines a symbol __GTHREAD_HAS_COND to signify that these extra
   features are supported.

   Types:
     __gthread_cond_t

   Macros:
     __GTHREAD_COND_INIT
     __GTHREAD_COND_INIT_FUNCTION

   Interface:
     int __gthread_cond_broadcast (__gthread_cond_t *cond);
     int __gthread_cond_wait (__gthread_cond_t *cond, __gthread_mutex_t *mutex);
     int __gthread_cond_wait_recursive (__gthread_cond_t *cond,
					__gthread_recursive_mutex_t *mutex);

   All functions returning int should return zero on success or the error
   number.  If the operation is not supported, -1 is returned.

   If the following are also defined, you should
     #define __GTHREADS_CXX0X 1
   to enable the c++0x thread library.

   Types:
     __gthread_t
     __gthread_time_t

   Interface:
     int __gthread_create (__gthread_t *thread, void *(*func) (void*),
                           void *args);
     int __gthread_join (__gthread_t thread, void **value_ptr);
     int __gthread_detach (__gthread_t thread);
     int __gthread_equal (__gthread_t t1, __gthread_t t2);
     __gthread_t __gthread_self (void);
     int __gthread_yield (void);

     int __gthread_mutex_timedlock (__gthread_mutex_t *m,
                                    const __gthread_time_t *abs_timeout);
     int __gthread_recursive_mutex_timedlock (__gthread_recursive_mutex_t *m,
                                          const __gthread_time_t *abs_time);

     int __gthread_cond_signal (__gthread_cond_t *cond);
     int __gthread_cond_timedwait (__gthread_cond_t *cond,
                                   __gthread_mutex_t *mutex,
                                   const __gthread_time_t *abs_timeout);

*/


ubuntu搭建基于arm-none-eabi-gcc,jlink驱动的平台,并实现stm32f103c8t6程序的编译链接和烧写 arm-none-eabi-gcc是属于gcc编译工具链,可以理解为针对arm工程的一个编译器,这个编译器只能用来编译裸奔程序,说白了就是不能编译带操作系统的工程,我们可能马上想到是否有能够编译操作系统的工程的版本,由于本博客属于入门级别,所以博主在这不多说太多,感兴趣的可以多了解以下arm-none-eabi-gcc相关系列,这里主要就是基本应用的使用。如图,选择合适的版本下载即可(自己的Ubuntu是多少位的尽量就下多少位的,否则后面会有些麻烦,这里博主用的是64位的,32位的可以到。 阅读详情

相关推荐

arm-none-eabi-gcc编译选项(ChibiOS)

demo: ChibiOS/demos/STM32/RT-STM32F407-DISCOVERY arm-none-eabi-gcc -c # 编译、汇编到目标代码,不进行链接 -mcpu=cortex-m4 # cpu架构的优化选项 -O2 # 更多的优化,会尝试几乎全部的优化功能,但不会进行“空间换时间”的优化方法 -ggdb # 为调试器 gd

uav360 4356

ARM 编译工具链详解

GNU Arm Embedded Toolchain 是用于 C/C++ 和汇编编程的即用型开源工具套件。GNU Arm 嵌入式开发工具链适用于 32 位 Arm Cortex-A,Arm Cortex-R 和 Arm Cortex-M 处理器系列。GNU Arm 嵌入式工具链包括 GNU 编译器 (GCC),可直接从 Arm 官方免费获得,用于在 Windows,Linux 和 Mac OS X 操作系统上进行嵌入式软件开发。

zhbi98 的技术 Blogs 1万+

ARM嵌入式开发:arm-none-eabi-gcc交叉编译器安装与配置全攻略

交叉编译是嵌入式开发的核心技术之一,它允许开发者在一种计算机架构上生成另一种架构的可执行代码。其原理在于编译器能够识别目标平台的指令集和二进制接口,将高级语言代码转换为特定硬件可执行的机器指令。这项技术的价值在于解决了开发环境与部署环境不一致的难题,极大提升了嵌入式系统、物联网设备和微控制器开发的效率。在ARM Cortex-M系列MCU、实时操作系统(RTOS)和裸机程序开发等场景中,交叉编译器是不可或缺的工具。本文聚焦于arm-none-eabi-gcc这一专为ARM架构裸机环境设计的工具链,针对WSL

weixin_34306593的博客 361

arm-eabi-gcc 和 arm-none-eabi-gcc 都是基于 GCC 的交叉编译器

您提供的网站是 Arm GNU Toolchain 的官方网站,它提供了不同的主机操作系统和目标架构的交叉工具链。arm-eabi-gcc 和 arm-none-eabi-gcc 都是基于 GCC 的交叉编译器,用于编译 ARM 架构的嵌入式系统。您也可以在这个网页上找到更多的信息,如安装说明、源代码包、已知问题等。arm-eabi-gcc 交叉编译器。

usstmiracle的博客 5855

Ubuntu 22.04 下 STM32F1 开发环境搭建:gcc-arm-none-eabi-10.3 + OpenOCD 0.12.0 完整配置

本文详细介绍了在Ubuntu 22.04系统下搭建STM32F1开发环境的完整流程,包括gcc-arm-none-eabi-10.3工具链安装、OpenOCD 0.12.0配置、工程编译与烧录实战。通过清晰的步骤指导和常见问题解决方案,帮助开发者快速构建高效的嵌入式Linux开发环境,提升STM32开发效率。

chouxuyi9789的博客 463

保姆级教程:在Windows上为NRF52 SDK 17.02配置gcc-arm-none-eabi-10工具链(含ECC库编译)

本文提供了一份详细的保姆级教程,指导开发者在Windows系统上为NRF52 SDK 17.02配置gcc-arm-none-eabi-10工具链,并包含ECC加密库的编译步骤。从工具链选型、环境搭建到micro-ecc库的编译实战,每个环节都提供了具体操作和常见问题解决方案,帮助开发者快速构建可靠的nRF52开发环境。

weixin_28711397的博客 248

嵌入式ARM RISCV toolchain工具 梳理arm-none-eabi-gcc

本文主要介绍了嵌入式toolchain的主要内容。

supperThomas的专栏 2521

告别Keil/IAR:手把手教你用GNU ARM Toolchain为STM32编译第一个程序

本文详细介绍了如何使用GNU ARM Toolchain为STM32编译第一个程序,从环境搭建、项目结构设计到编写Makefile和调试技巧,全面指导开发者从Keil/IAR迁移到命令行工具链。通过实战案例和进阶技巧,帮助开发者掌握免费、跨平台的ARM开发工具链,提升嵌入式开发效率。

weixin_30336061的博客 361

GNU ARM Embedded Toolchain 和GCC是什么关系?

GCC的初衷是为GNU操作系统专门编写的一款编译器。ARM 官方维护: 这个特定的工具链是由 Arm 官方发布并维护的(基于 GNU 开源项目),专门针对 ARM 处理器进行了优化(如支持 Thumb 指令集、MVE 向量扩展等)。在日常开发对话中,大家经常说“用 GCC 编译一下”,其实指代的往往是“使用 GNU ARM Embedded Toolchain 里的 GCC 进行编译”。因为 GCC 太出名了: 它是整个工具链的核心,负责最复杂的代码翻译工作,所以大家习惯用核心组件的名字来代指整个工具链。

strongerHuang 334

嵌入式开发环境搭建:Eclipse与GCC ARM工具链的整合实践

在嵌入式系统开发中,工具链的选择与集成是项目成功的基础。GCC作为开源的编译器集合,通过交叉编译支持多种处理器架构,其ARM版本(GCC ARM)为嵌入式设备提供了高效的代码生成能力。工具链的价值在于将高级语言转化为目标硬件可执行的机器码,同时优化代码大小与执行效率。在实际应用中,开发者常面临命令行工具与集成开发环境(IDE)的权衡:命令行提供底层控制,而IDE如Eclipse则通过图形化界面提升工程管理、代码导航和调试效率。通过GNU ARM Eclipse插件,可将GCC ARM无缝接入Eclipse,

weixin_30443075的博客 343

音乐频谱灯的硬件艺术:从STM32到SK9822LED的工程美学

本文探讨了基于STM32微控制器和SK9822 LED的音乐频谱灯硬件设计与实现。通过ADC采集音频信号,利用FFT算法进行频谱分析,并驱动LED阵列呈现动态视觉效果,展现了硬件工程与艺术美学的完美融合。

Pepper的专栏 217

arm-none-eabi-gcc 编译方法

编译环境:Linux XXXXX 5.0.0-31-generic #33~18.04.1-Ubuntu SMP Tue Oct 1 10:20:39 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux 1,下载arm-none-eabi-gcc  https://launchpad.net/gcc-arm-embedded/+download  gcc-arm-n...

Life_Maze的博客 4224

深入MIPI DSI显示技术栈 (三) DSI vs CSI-2:孪生协议的本质差异

MIPI协议中的DSI与CSI-2存在本质差异:DSI为输出导向协议(Host→Display),用于屏幕控制和画面传输;CSI-2为输入导向协议(Sensor→Host),专攻图像采集。二者在包结构、同步机制、物理层优化等方面均有显著区别:DSI支持命令包和BLLP包,CSI-2具备嵌入式数据包;DSI时钟模式以Burst为主,CSI-2支持Continuous模式。典型场景中,二者协同工作(如手机相机预览),需注意时序同步和延迟控制。设计混合系统时,需合理规划虚拟通道和物理层资源,充分发挥这对&quot

GateWorld的博客 2106

基于Linux x86_64系统编译arm-gcc-4.8: arm-none-eabi-gcc

之前构建了在Linux下进行stm32开发的环境,用的是arm-none-eabi-gcc这个编译器。最近重装了ubuntu,升级到了14.04,发现不能用这个gcc了,提示没有那个文件或目录。发现原来下的那个gcc竟然是32位的,而我的ubuntu是64位的,之前能用是因为在之前的系统装了lib32这个包,可以兼容32位软件。想再装一下这个包,发现已经不支持了。64位确实该成为主流了,可是还是有

MyBlog of Embbnux 3690

手把手教你用PlantVillage数据集搭建农作物病害识别模型(Python实战)

本文详细介绍了如何使用PlantVillage数据集和Python构建农作物病害识别模型。从环境准备、数据获取到模型构建、训练与评估,手把手教你实现一个实用的农业AI应用。特别针对PlantVillage数据集的特点,提供了处理类别不平衡、图像预处理和模型优化的实战技巧,帮助开发者快速掌握农作物病害识别技术。

weixin_29184371的博客 479

十四种逻辑器件综合对比——《器件手册--逻辑器件》

逻辑器件是数字电路中最基本的逻辑单元,用于实现基本的逻辑运算,如与、或、非、异或等。逻辑门根据输入信号的组合产生相应的输出信号。与门:只有当所有输入信号都为高电平时,输出才为高电平。或门:只要有一个输入信号为高电平,输出就为高电平。非门:输出信号与输入信号相反。异或门:当两个输入信号不同时,输出为高电平;相同则输出为低电平。用于对输入信号进行反相操作,即将高电平转换为低电平,低电平转换为高电平。常用于信号的反相处理和逻辑电平的转换。

XU157303764的博客 2030

笔记2 基于Makefile使用GCC编译HAL库例程

基于Makefile使用GCC编译HAL库例程

weixin_43259293的博客 1072

华为OD机试真题 新系统2026-04-15 C++ 实现【失灵的键盘】

有一个键盘有2个按键失灵了,按下这些键时会连续输出其他键对应的字符两次。具体如下: 1. 按下j键一次,屏幕上显示uu(两个连续的u);  按下b键一次,屏幕上显示t(两个连续的t) 2. u键和t键是好的,按下u键一次时,屏幕只会显示一次u(正常按键);按下t键一次时,屏幕只会显示一次t(正常按键) 3. 假定屏幕上连续显示两个t一定是按了一次b键,而不是两次t键;假定按键t之后不会紧接着按键b,即tttt转义为两个b,而不可能是tb

MISAYAONE的博客 212

arm-none-eabi-gcc编译器的安装和相关配置

首先,下载gcc的源码:https://launchpad.net/gcc-arm-embedded/+download 其次,安装所需的其他相关工具: sudoapt-get installapt-src gawkperl autoconf m4 automake sudoapt-get installlibtool libncurses5-dev gettex

E梦电子--whble 2927

002、搭建你的第一个Agent开发环境:Python与核心库安装

在上一篇《Agent智能体开发入门:概念、应用与前景》中,我们描绘了Agent智能体的宏伟蓝图,理解了其作为“数字员工”的巨大潜力。然而,许多开发者在迈出第一步时,常常被复杂的依赖、版本冲突和晦涩的配置所劝退,空有想法却无从下手。这种感觉就像拿到了一张藏宝图,却找不到出发的港口。本文正是你的“启航指南”。我们将彻底解决这个痛点,通过一个清晰、可复现的流程,为你搭建一个专为Agent开发量身定制的Python环境。一个纯净、隔离的Python虚拟环境,避免项目间的“依赖地狱”。一套经过验证的核心工具链。

G_RE_RE的博客 111

Aurix TC3xx系列MCU ResourceM模块配置(多核资源分配)

为减轻主核的负载率或者平衡各个核的资源分配,通常需要把一些MCU内部资源分配到从核上,在EB tresos工具中,通过ResourceM模块实现多核资源分配。

m0_38045338的博客 1388

ARM交叉编译工具链

摘自:http://www.veryarm.com/cross-tools 摘自:http://www.veryarm.com/296.html 交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,

calm_agan的专栏 1736

【数据集】全球大气空气柱平均甲烷(XCH₄)和一氧化碳(XCO)浓度数据集 TROPOMI/WFMD

全球大气空气柱平均甲烷(XCH₄)和一氧化碳(XCO)浓度数据集 TROPOMI/WFMD

WW、forever的博客 388

Ubuntu 22.04 LTS 下 STM32 开发环境搭建:gcc-arm-none-eabi-10.3 + OpenOCD 0.12.0 完整配置

本文详细介绍了在Ubuntu 22.04 LTS系统下搭建STM32开发环境的完整流程,包括gcc-arm-none-eabi-10.3编译器和OpenOCD 0.12.0调试工具的安装与配置。通过系统环境准备、工具链安装、OpenOCD优化及开发环境验证等步骤,帮助开发者高效完成STM32项目的编译与烧录工作,特别适合嵌入式开发者在Linux平台进行STM32开发。

clhq71932的博客 290

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【TDA4系列】ARM交叉编译工具命名规则与常识

TDA4的A73使用的gcc为: arm-none-linux-gnueabihf aarch64-none-linux-gnu 这些版本的区别是什么?我该下载哪个版本? 区别无外乎几个:大端 or 小端、ARMv7 or ARMv8、32位 or 64位、裸机 or 嵌入式Linux (参考:https://www.cnblogs.com/Ph-one/p/12857812.html) 关于GCC交叉编译工具 arm-none-linux-gnueabi-gcc是 Codesourcery 公司(

AbiUni(YY熊) 725

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

上一篇: 统计 移植的库占据系统多少RAM
下一篇: Wi-Fi 基本知识
杨尘心
博客等级 码龄10年 122粉丝 88原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值