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

aarch64-none-elf-gcc与aarch64-linux-gnu-gcc

1. 场景描述

在Ubuntu 24.04.1 LTS x86_64架构下交叉编译能跑在aarch64架构下裸机程序,遇到缺aarch64-none-elf-gcc的情况,做此记录。

2. aarch64-none-elf-gcc与aarch64-linux-gnu-gcc

  • 运行环境
    • aarch64-none-elf-gcc 生成的代码是 裸机程序(不依赖操作系统),适用于编写 OS 内核、Bootloader、嵌入式软件。
    • aarch64-linux-gnu-gcc 生成的代码依赖 GNU/Linux 运行环境,适用于 Linux 平台的应用开发。
  • 标准库
    • aarch64-none-elf-gcc 可能使用 newlib 或者 没有标准 C 库,因为裸机环境中通常没有 glibc。
    • aarch64-linux-gnu-gcc 依赖 glibc 或者 musl,适用于 Linux 用户态开发。
  • 链接方式
    • aarch64-none-elf-gcc 不会 链接 Linux 运行时 (glibc),通常使用裸机运行时或者手写的 start-up 代码。
    • aarch64-linux-gnu-gcc 需要 兼容 Linux 的 glibc 运行库,可以运行在 Linux 发行版上。
  • 适用场景
    • 编写 AArch64 内核、Bootloader、裸机程序:用 aarch64-none-elf-gcc。
    • 编写 Linux 用户态程序(比如运行在 ARM 服务器上的 C 代码):用 aarch64-linux-gnu-gcc。

差别汇总如下表所示:

编译器目标架构运行环境主要用途
aarch64-none-elf-gccAArch64裸机(bare-metal)无操作系统 用于编译嵌入式系统、OS 内核、Bootloader
aarch64-linux-gnu-gccAArch64 Linux用户空间用于编译 Linux 应用程序、库

3. 安装配置

3.1 aarch64-linux-gnu-gcc

在Ubuntu 24.04.1 LTS需要aarch64-linux-gnu-gcc编译器,仅仅需要通过apt进行包安装即可

apt-get install gcc-aarch64-linux-gnu

提供的命令如下图所示:
在这里插入图片描述

3.2 aarch64-none-elf-gcc

3.2.1 工具链下载

下载地址:

https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads

根据实验平台(x86_64上交叉编译AArch64)需要下载相关版本

wget https://developer.arm.com/-/media/Files/downloads/gnu/14.2.rel1/binrel/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf.tar.xz

3.2.2 配置环境变量

解压

xz -d arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf.tar.xz 
tar -xvf arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf.tar -C /opt/

设置环境变量
vim ~/.bashrc

export TOOLCHAIN=/opt/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf
export PATH=$PATH:$TOOLCHAIN/bin

使环境变量生效

source .bashrc

提供的命令如下图所示:
在这里插入图片描述现在就可以基于aarch64-none-elf-gcc编译器交叉编译aarch64裸机程序了。

注:ELF(Executable and Linkable Format),ELF(可执行与可链接格式)是一种 文件格式,用于存储可执行文件、目标文件、共享库 和 核心转储(core dump)。它是 Linux 及大多数 Unix 系统 上的标准可执行文件格式。

相关文章:

  • 源码分析之Leaflet中control模块Zoom类实现原理
  • 第二十二章:Python-NLTK库:自然语言处理
  • Vue3.5 企业级管理系统实战(十二):组件尺寸及多语言实现
  • k8s运维面试总结(持续更新)
  • 【Harmonyos】项目开发总结--摇杆拖动侧重实现(适用游戏摇杆)
  • 数据库表的三种关系,通俗易懂的讲解
  • 【RAG 系统实战课】01 用RAG改造传统MIS系统
  • MySQL 中常用的日期和时间类型
  • Nuxt2中全局路由守卫的写法(含Nuxt3写法和变化)
  • 01背包问题二维数组和一维数组间的区别
  • RAG优化:python从零实现Proposition Chunking[命题分块]让 RAG不再“断章取义”,从此“言之有物”!
  • 基于mediapipe深度学习和限定半径最近邻分类树算法的人体摔倒检测系统python源码
  • 步进电机驱动电压对定位精度的深层影响分析
  • 机器学习的定义及分类
  • # 注意力机制
  • Spring Event 观察者模型及事件和消息队列之间的区别笔记
  • HMTL+JS+CSS实现贪吃蛇游戏,包含有一般模式,困难模式,还有无敌模式
  • 前端如何导入谷歌字体库
  • arm_mat_init_f32用法 dsp库
  • ansible-playbook 执行剧本报错: libselinux-python) aren‘t installed!
  • 德州国资欲退出三东筑工,后者大股东系当地房企东海集团
  • 银行积分大幅贬值遭质疑,涉及工行、中行、农行等
  • 最高人民法院、中国证监会联合发布《关于严格公正执法司法 服务保障资本市场高质量发展的指导意见》
  • 经济日报评外卖平台被约谈:行业竞争不能背离服务本质
  • 证券时报:中美互降关税落地,订单集中补发港口将迎高峰期
  • 今天北京白天气温超30℃,晚间为何下冰雹?