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
相关推荐
aixingkong9214 小时前
Nvidia为例 XPU的Multi-Host、Socket Direct 、GPUDirect、RDMA 技术点分析
服务器·网络·硬件架构·硬件工程
雯宝6 小时前
mnt_init 函数
linux
律宏阔12 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔12 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴12 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千12 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei3712 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei3712 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei3712 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
judezh12 小时前
api 容器一直 unhealthy?我把一个 Agent 运行时的健康检查逐条拆了,查出四个问题
运维·docker