Linux交叉编译工具链

Linux交叉编译工具链

前言

Linux交叉编译工具链是在一种计算机架构(如x86个人电脑)上,编译生成能在另一种不同架构(如ARM处理器)上运行代码的整套开发工具。

1. 交叉编译工具链的命名规则

1.1 命名规则

复制代码
arch[-vendor][-os][-abi]

1.2 详细说明

arch (架构): 目标处理器架构,如 arm, aarch64,mips, riscv, x86_64。

vendor (提供商/厂商): 工具链提供商名称。unknown或none表示无厂商

os(操作系统): 目标操作系统,如linux。none或者不填表示无操作系统(裸机)

abi(应用二进制接口): 指定库函数和映像的规范

  • eabi: 无操作系统(裸机)的嵌入式 ABI

  • gnu: 使用 glibc 库 + oabi (old abi, 旧版 ABI)

  • gnueabi: 使用 glibc 库 + eabi (embedded abi, 嵌入式 ABI)

  • gnueabihf: 使用 glibc 库 + eabi (embedded abi, 嵌入式 ABI),支持硬件浮点 (hard float)

  • musl: 使用 musl 库 + oabi

  • musleabi: 使用 musl 库 + eabi

  • musleabihf: 使用 musl 库 + eabi,支持硬件浮点

1.3 示例

arm-none-eabi:无操作系统arm编译器,不支持与操作系统有关的函数,如fork

aarch64-none-linux-gnu:Linux系统aarch64编译器

2. 交叉编译工具链的组成

  • 编译器:gcc/g++交叉编译器将源代码编译成目标文件
  • Binutils:提供二进制文件处理的基础工具集,包括链接器ld,汇编器as,静态库打包工具ar,目标文件查看工具readelf,去除符号strip等
  • C标准库:标准C函数(如malloc printf)的实现,如C标准库函数malloc通过封装系统调用brk和mmap,来更便捷的实现用户态内存分配
  • sysroot系统根目录:sysroot是目标平台文件系统结构的目录,包含了目标设备所需的头文件、库文件、配置文件等开发资源和运行时依赖
名称 描述 典型应用场景
GNU C Library (glibc) Linux系统的标准C库。功能最完整、遵循标准最严格、对POSIX和Linux特有API支持最好。但体积最大,动态链接依赖较多 标准Linux桌面/服务器
musl 轻量、快速、优雅的C库。专注于静态链接,体积极小,遵循标准严格。静态链接是其最大优势,但某些非标准/历史兼容API支持不如glibc 对体积敏感的嵌入式Linux、容器基础镜像、静态编译发行版
uClibc-ng 为资源极度受限的嵌入式系统设计。高度可配置,可裁剪到非常小。更注重"能用"而非严格遵循标准,性能与兼容性权衡较多 老式路由器、IoT设备、内存/存储极小的Linux系统
newlib 专为嵌入式"裸机"系统设计。不依赖操作系统,需要用户自行实现底层系统调用接口。非常轻量,是许多RTOS的默认C库 Cortex-M等微控制器程序、无操作系统的嵌入式系统
Bionic 由Google为Android开发。源自BSD C库,但经过大量修改。不完整支持POSIX,添加了Android特有API 仅用于Android系统及应用开发
BSD libc 如 FreeBSD/OpenBSD 的 libc。是GNU/Linux系统外的一个重要分支,代码和质量很高 BSD系列操作系统
Microsoft C run-time library Windows操作系统的C运行库。实现了C标准库和Windows特有的运行时支持。 仅用于Windows平台原生程序开发

3. 制作交叉编译工具链

3.1 crosstool-NG

crosstool-NG

专门用于构建交叉编译工具链的自动化配置工具

3.2 Buildroot

Buildroot官网

Buildroot是一个嵌入式Linux构建系统,可以构建整个嵌入式系统,包括交叉编译器工具链cross-compilation toolchain、根文件系统rootfs、Linux内核和引导加载程序bootloader等

3.3 手动构建

下载源码手动构建,使用kernel+gcc+glibc+binutils的源码包编译。


Reference:

  1. Binutils - GNU Project - Free Software Foundation
  2. The GNU C Library - GNU Project - Free Software Foundation
  3. Cross-compilation toolchains for Linux - Home
  4. musl libc toolchains | static cross/native toolchains
相关推荐
袁煦丞 cpolar内网穿透实验室1 分钟前
远程调试内网 Kafka 不再求运维!cpolar 内网穿透实验室第 791 个成功挑战
运维·分布式·kafka·远程工作·内网穿透·cpolar
AZ996ZA12 分钟前
自学linux的第二十一天【DHCP 服务从入门到实战】
linux·运维·服务器·php
_OP_CHEN17 分钟前
【Linux系统编程】(二十八)深入 ELF 文件原理:从目标文件到程序加载的完整揭秘
linux·操作系统·编译·c/c++·目标文件·elf文件
Web极客码19 分钟前
WordPress博客关键词
服务器·wordpress·网站加速
Fleshy数模1 小时前
MySQL 表创建全攻略:Navicat 图形化与 Xshell 命令行双模式实践
linux·mysql
神梦流1 小时前
GE 引擎的非标准数据流处理:稀疏张量与自定义算子在图优化中的语义保持
linux·运维·服务器
兜兜转转了多少年1 小时前
从脚本到系统:2026 年 AI 代理驱动的 Shell 自动化
运维·人工智能·自动化
.小墨迹2 小时前
apollo学习之借道超车的速度规划
linux·c++·学习·算法·ubuntu
Lsir10110_2 小时前
【Linux】中断 —— 操作系统的运行基石
linux·运维·嵌入式硬件
Sheffield2 小时前
command和shell模块到底区别在哪?
linux·云计算·ansible