Linux系统交叉编译:依赖、构建与实践
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
参考:豆包AI问答内容
参考:https://blog.csdn.net/mo4776/article/details/119837501
一. linux系统交叉编译时,通常目标系统编译环境包含:
通常交叉编译应用库时,需要构建目标系统的编译环境。
目标系统的编译环境包含了:目标系统的底层接口与库、交叉编译的glibc接口与库、交叉编译的gcc接口与库。
1. 目标系统的底层接口与库
这是目标系统中最基础的部分,包含了 Linux 内核提供的系统调用接口,以及一些直接与内核交互的底层库。它们是用户态程序与内核进行交互的桥梁,不依赖其他用户态的接口和库,是整个依赖体系的底层支撑。核心内容有
- 目标系统的内核头文件(linux/*.h):定义系统调用、数据结构等内核接口,是 glibc 封装系统调用的依据。
- 基础系统库及链接器:如ld-linux-armhf.so(动态链接器)、libdl.so(动态加载库)等,与 ARM 架构的二进制格式(ELF)适配。
- 硬件相关接口:针对目标 ARM 设备的板级支持库(如嵌入式设备的专用驱动接口)。
2. glibc的接口与库
作为 Linux 系统中广泛使用的 C 标准库,glibc 提供了丰富的 C 语言标准函数接口(像输入输出、内存分配、字符串处理等),同时也对目标系统的底层接口(如系统调用)进行了封装,方便上层程序调用。 核心内容如下,构建目标系统架构的 glibc 库,需产出以下关键组件,且这些组件必须与目标系统底层接口(内核头文件、硬件特性)严格匹配。
- 核心库文件:
libc.so:提供基础 C 函数(如printf、malloc、strcpy等),其内部实现依赖目标系统的系统调用(如write、mmap)。注:libc是ANSI C函数库,原来linux系统下的标准库,后来逐渐被glibc取代,被glibc所包含。
libm.so:数学函数库,依赖目标系统的浮点运算硬件支持(如 ARM 的 VFP/NEON 指令集)。
ld.so(动态链接器):负责在目标系统上加载和链接动态库,需适配目标架构的 ELF 格式和内核的进程管理接口。 - 头文件:
生成与目标系统匹配的stdio.h、stdlib.h等头文件,其宏定义(如size_t的位数)、系统调用常量(如O_RDWR的值)需与目标内核头文件一致。 - 辅助工具:
如ldd(查看动态依赖)、locale相关工具,需运行在目标系统或通过交叉编译适配目标架构。
3. gcc的接口与库
主要指 gcc 编译器的运行时库(例如libgcc_s.so)以及相关接口。这些库和接口为编译器生成的代码提供支持,涵盖了异常处理、特定硬件指令优化、基础运算辅助等功能,确保编译后的程序能够正确执行。
二. 部件依赖关系:
1. glibc 的接口与库依赖目标系统的底层接口与库;
glibc 的众多功能实现都依赖于目标系统底层提供的接口和库。比如,glibc 中的printf函数最终需要通过调用内核的系统调用(sys_read, sys_write)来实现输出功能,其内存管理函数(如malloc)也依赖内核提供的内存分配(brk或map)相关接口。如果脱离了目标系统的底层接口与库,glibc 就无法正常完成其功能封装和实现。
2. gcc的库依赖操作系统与glibc的库;
- 一方面,gcc 的运行时库在实现过程中,需要借助 glibc 提供的各种基础函数接口,像字符串操作、内存管理等,来完成自身的一些功能逻辑。
- 另一方面,gcc 的接口与库所涉及的一些底层功能,例如与硬件相关的指令优化、异常处理机制等,可能需要间接通过目标系统的底层接口与库和内核进行交互,以获取硬件信息或使用内核提供的相关机制。
3. 对交叉编译的影响
- 在交叉编译过程中,这种依赖关系有着重要影响,需要特别注意以下几点:
确保所使用的 glibc 的接口与库版本和目标系统的底层接口与库相兼容,否则可能出现函数调用失败、系统调用不匹配等问题。 - 选择的交叉编译器(包含 gcc 的接口与库)需要与目标系统的架构、glibc 版本等相适配,以保证编译出的程序能够在目标系统上正常运行。
- 若更换 C 标准库(如使用 musl libc 替代 glibc),需确认 gcc 的接口与库能够与新的 C 标准库的接口与库兼容,避免出现链接错误或运行时异常。
如果要在一个环境里,建立另一个操作系统下的编译环境,用于编译出另一个环境的可执行库,通常编译的时候,需要一次建立以上的三者。
4. 版本匹配-glibc与gcc版本查看
glibc与gcc的版本,通常是确定使用的版本后,例如使用glibc2.17+gcc7.5.0;
后续就会持续沿用,不做修改,避免版本在某些系统下出现符号找不到的情况。
-
通过ldd版本查看glib版本
$ ldd --version
ldd (GNU libc) 2.17
注:ldd是隶属于glibc,它的版本就是glibc的版本,通常可以使用下面命令查询glibc版本。 -
通过getconf工具查看glib版本
$ getconf GNU_LIBC_VERSION
glibc 2.17
$ getconf GNU_LIBPTHREAD_VERSION
NPTL 2.17
注:pthread也是一个非常重要的库,它被包含在glibc中,可以通过getconf GNU_LIBPTHREAD_VERSION查看它的版本,是与glibc的版本是一致的。 -
查看gcc版本
$ gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
三. 交叉编译环境构建(例如在x86的环境构建arm环境的运行库中)
-
首先,需要安装目标系统的底层接口与库。
这一过程的核心是获取与目标 ARM 系统匹配的内核接口定义、基础系统库(如libc依赖的底层组件)及架构相关的头文件,确保后续 glibc、gcc 库的交叉编译能正确适配目标环境。 -
之后,构建依赖arm版本系统底层接口的glibc库。
-
再之后,构建依赖arm版本系统底层接口、arm版本glibc的gcc库。
3.1 安装目标系统底层接口与库
获取目标系统底层接口与库,构建一个sysroot目录,作为目标系统的核心系统根目录与包含相关接口与库文件。
-
方式一:从目标 ARM 设备的根文件系统中拷贝(/lib、/usr/lib、/usr/include等目录)。
-
方式二:通过包管理器下载(如apt-get install libc6:armhf linux-libc-dev:armhf)。
# 若需ARM 64位(aarch64)环境,替换为:
# sudo yum install -y glibc-aarch64-linux-gnu glibc-aarch64-linux-gnu-devel
# sudo yum install -y kernel-headers-aarch64
- 方式三:使用交叉工具链自带的sysroot(预编译的目标系统根文件系统,适合快速搭建)。
例如:使用linaro网站上,提供的交叉工具链。
在路径上,既有带有glibc+sysroot的版本,也有带有gcc+glibc+sysroot的版本,可以作为选择使用。
https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/
3.2 构建依赖目标系统底层接口的glibc库
构建方式(以 x86 主机交叉编译 ARM 版 glibc 为例)
3.2.1 准备内容
- 获取 glibc 源码:选择与目标系统兼容的版本(如 glibc 2.31,需与目标内核版本匹配,通常内核版本 ≥ glibc 版本)。
- 目标系统内核头文件:必须是目标 ARM 系统的内核头文件(如linux-headers-5.4.0-armhf),路径假设为/opt/arm-kernel-headers。
- 交叉编译工具链基础组件:需先安装针对 ARM 的基础编译器(如arm-linux-gnueabihf-gcc),用于编译 glibc 源码。
3.2.2 准备arm的基础交叉编译编译器(如arm-linux-gnueabihf-gcc)
主流 Linux 发行版的包管理器中通常内置了常用的 ARM 交叉工具链,直接通过包管理命令即可安装,无需手动编译。
#1. ---Debian/Ubuntu 系统---
# 安装64位ARM(aarch64)交叉工具链
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu#2.---RedHat/CentOS 系统---
# 安装64位ARM交叉工具链
sudo yum install gcc-aarch64-linux-gnu#3. ---RedHat/CentOS 系统-arm环境安装x86的交叉工具链样例---
# 安装 x86_64 交叉编译器
sudo apt install gcc-x86-64-linux-gnu g++-x86-64-linux-gnu
验证安装:安装完成后,通过以下命令确认工具链可用:
# 查看64位ARM编译器版本:交叉编译aarch64版本时使用
aarch64-linux-gnu-gcc --version$ 查看64为x86编译环器版本:交叉编译x86_64版本时使用
x86_64-linux-gnu-gcc --version
输出应包含aarch64-linux-gnu字样,表明工具链针对 ARM 架构。
$ aarch64-linux-gnu-gcc --version
aarch64-linux-gnu-gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16)
3.2.3 配置、编译、安装(关键步骤,关联目标系统底层接口)
创建单独的编译目录(避免污染源码),执行configure脚本:
# 创建编译目录
mkdir -p glibc-build && cd glibc-build# 命令描述:配置glibc,关联目标ARM架构和底层接口
# 注意:configure脚本指定了交叉编译选项后,编译构建时会主动找机器内安装的aarch64-linux-gnu-gcc/x86_64-linux-gnu-gcc参与构建。
../configure \--host=aarch64-linux-gnu \ # 目标架构(必须与交叉编译器前缀一致)--prefix=/usr \ # 安装相对路径(instal时指定DESTDIR来确定安装的sysroot目录)--with-headers=/opt/aarch64-kernel-headers/usr/include \ # 目标系统内核头文件路径--disable-werror \ # 避免非致命警告导致编译失败--enable-add-ons # 启用额外组件(如nptl线程库)# 命令执行:
# 提示,如果configure执行时遇到 checking whether autoconf works... no 错误,需要安装gmake老版本make-3.82,并指定MAKE
../configure --host=aarch64-linux-gnu --prefix=/usr --with-headers=/opt/aarch64-kernel-headers/usr/include --disable-werror --enable-add-ons MAKE=/usr/local/make-3.82/bin/make# 编译(可加-jN启用多线程加速,N为CPU核心数)
make -j64# 安装到指定的sysroot目录(DESTDIR=/opt/aarch64-sysroot将作为后续交叉编译的根文件系统)
make install DESTDIR=/opt/aarch64-sysroot
关键参数:
–host:指定生成的 glibc 用于 ARM 架构,确保编译出的库是 ARM 指令集。
–with-headers:强制 glibc 使用目标系统的内核头文件,保证系统调用(如syscall)的定义与目标内核一致。
make install DESTDIR=/opt/aarch64-sysroot:安装时指定的sysroot目录,构建出了sysroot=DESTDIR中的内容情况:
/opt/aarch64-sysroot]$ ls
etc lib sbin usr var
3.2.4 手动复制内核头文件到新构建的sysroot目录中
内核系统头文件需手动复制 到 sysroot 的 usr/include 目录,才能形成完整的目标系统头文件环境。
cp -r /opt/aarch64-kernel-headers/usr/include/* /opt/aarch64-sysroot/usr/include/
验证兼容性
检查库的架构:通过file命令确认生成的是 ARM 格式库:
file /opt/aarch64-sysroot/lib/libc.so.6
# 输出应包含 "ARM" 或 "arm-linux-gnueabihf" 字样
验证系统调用关联:通过readelf -s查看libc.so是否引用了目标内核的系统调用符号(如__NR_write)
3.2.5. 注意事项
- 内核头文件版本匹配:若 glibc 版本高于目标内核版本,可能出现 “未定义的系统调用” 错误(如 glibc 使用了目标内核不支持的新系统调用)。
- 硬件特性适配:若目标 ARM 设备支持硬件浮点(如 armhf),需确保 glibc 编译时启用了–with-fp(通常交叉工具链会自动传递该参数)。
- 路径一致性:安装路径必须纳入后续 gcc 库构建的sysroot,否则 gcc 无法找到 ARM 版 glibc 进行依赖关联。
通过以上步骤,即可构建出依赖目标系统底层接口的 glibc 库,为后续 gcc 库的交叉编译和应用程序开发提供基础 C 标准库支持。
3.3 构建依赖目标系统底层接口、目标系统glibc的gcc库
3.3.1. 构建前提
- 目标系统底层接口:目标架构的内核头文件(如/path/to/target-kernel-headers)。
- 目标系统 glibc 库:已交叉编译完成的目标架构 glibc(如安装在/path/to/target-sysroot/usr)。
- 基础交叉编译器:针对目标架构的基础编译器(如x86_64-linux-gnu-gcc,用于编译 gcc 源码)。
3.3.2. 准备源码与目录
# 获取gcc源码(包含必要的依赖库,如mpfr、gmp、mpc)
wget https://ftp.gnu.org/gnu/gcc/gcc-7.5.0/gcc-7.5.0.tar.xz
tar -xf gcc-7.5.0.tar.xz
cd gcc-7.5.0# 执行下载gcc依赖的子模块
# 提示:包括gmp-6.1.0.tar.bz2、mpfr-3.1.4.tar.bz2、mpc-1.0.3.tar.gz、isl-0.16.1.tar.bz2
# 接下来执行 GCC 标准的编译安装流程(./configure && make && make install)时,GCC 的构建系统会自动处理这些已下载的依赖库,将它们作为内部库进行编译和链接,而不需要你单独对它们进行配置和安装。
# 提示:有时也通过yum方式安装 yum install gmp-devel mpfr-devel libmpc-devel
./contrib/download_prerequisites
```c
$ ./contrib/download_prerequisites
2025-08-05 09:21:32 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2 [2383840] -> "./gmp-6.1.0.tar.bz2" [1]
2025-08-05 09:21:37 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2 [1279284] -> "./mpfr-3.1.4.tar.bz2" [1]
2025-08-05 09:21:42 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz [669925] -> "./mpc-1.0.3.tar.gz" [1]
2025-08-05 09:21:47 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.16.1.tar.bz2 [1626446] -> "./isl-0.16.1.tar.bz2" [1]
gmp-6.1.0.tar.bz2: OK
mpfr-3.1.4.tar.bz2: OK
mpc-1.0.3.tar.gz: OK
isl-0.16.1.tar.bz2: OK
All prerequisites downloaded successfully.# 创建单独的编译目录
mkdir -p build && cd build
3.3.3. 配置与构建
配置 gcc(关键步骤:关联目标系统底层接口和 glibc)
通过configure脚本指定目标架构、依赖路径等核心参数:
提示:configure脚本指定了交叉编译选项后,编译构建时会主动找机器内安装的aarch64-linux-gnu-gcc/x86_64-linux-gnu-gcc参与构建。
提示:查看glibc版本方法 strings ./sysroot/lib/libc.so.6|grep GLIBC_|grep -v @
提示:构建 GCC 时只需正确设置 --sysroot 指向包含 glibc 的目标 sysroot,即可确保 GCC 正确关联目标系统的依赖,无需担心路径兼容性问题。
# 命令描述
../configure \--target=aarch64-linux-gnu \ # 目标架构(与交叉编译器一致)--host=x86_64-linux-gnu \ # 主机架构(当前编译主机为ARM64)--prefix=/opt/aarch64-sysroot/usr \ # 最终安装路径--with-sysroot=/opt/aarch64-sysroot \ # 目标系统根文件系统(包含glibc和底层接口)--with-glibc-version=2.25 \ # 目标系统glibc版本(需与实际安装版本一致)--with-headers=/usr/aarch64-linux-gnu/sys-root/usr/include \ # 目标系统头文件(含内核和glibc头文件)--enable-languages=c,c++ \ # 支持的编程语言(C/C++)--disable-multilib # 禁用多架构支持(仅针对目标架构)# 命令
# host使用--host=x86_64-linux-gnu或--host=x86_64-pc-linux-gnu,通常使用前者即可,部分情况可能要使用后者
../configure --target=aarch64-linux-gnu --host=x86_64-pc-linux-gnu --prefix=/opt/aarch64-sysroot/usr --with-sysroot=/opt/aarch64-sysroot --with-glibc-version=2.25 --enable-languages=c,c++ --disable-multilib # 编译(使用多线程加速,-j后数字为CPU核心数)
make -j8# 安装到指定路径
sudo make install
关键参数解析:
–target:指定生成的 gcc 库用于 aarch64 架构,确保输出文件为 aarch64 指令集。
–with-sysroot:指定目标系统的根文件系统路径,该路径需包含:
目标 glibc 库(/path/to/target-sysroot/usr/lib下的libc.so等);
目标底层接口(如内核头文件、动态链接器)。
–with-glibc-version:显式指定目标 glibc 版本,避免 gcc 链接到错误的 glibc 接口。
验证依赖关联
通过readelf检查生成的 gcc 库是否正确关联目标 glibc:
# 检查libstdc++.so是否依赖目标系统的libc.so
readelf -d /opt/aarch64-sysroot/lib/libstdc++.so.6 | grep NEEDED# 输出应包含:Shared library: [libc.so.6](来自目标系统的glibc)
关键注意事项
版本兼容性:gcc 版本需与目标 glibc 版本兼容(可参考 gcc 官方文档的兼容性列表),否则可能出现 “函数接口不匹配” 错误。
路径一致性:–with-sysroot指定的路径必须与目标 glibc 的安装路径一致,否则 gcc 无法找到 glibc 库进行链接。
硬件特性适配:若目标系统支持特定硬件指令(如 x86_64 的 AVX2、ARM 的 NEON),可通过–with-cpu或–with-fpu参数启用,优化生成代码的性能。
多语言支持:若需支持 Fortran、Ada 等语言,需在–enable-languages中添加对应选项,并确保目标 glibc 包含相关依赖。
构建完成后,该 gcc 库会形成完整的依赖链:
gcc运行时库(目标架构) → 目标glibc库 → 目标系统底层接口
3.3.4. 验证安装binutils工具
使用编译号的gcc程序,尝试编译测试程序。
$ cat test.c
#include "stdio.h"
int main(){printf("hello world!");return 0;
}
如果编译成功,则不需要额外处理,不需要安装binutils工具。
如果尝试编译程序,遇到-EL不识别的错误处理。则进行下一步处理,缺少aarch64-linux-gnu-as配套工具,需要进行安装。
$ ./bin/aarch64-linux-gnu-gcc test.c
as: unrecognized option '-EL'
对缺少的aarch64-linux-gnu-as等工具,进行安装,安装方法如下
- 下载 binutils 源码
推荐使用与 GCC 版本兼容的 binutils(如 2.31 搭配 GCC 7.5.0):
wget https://ftp.gnu.org/gnu/binutils/binutils-2.31.tar.xz
tar -xf binutils-2.31.tar.xz
cd binutils-2.31
- 配置并编译 binutils
# 创建编译目录
mkdir -p build && cd build# 配置说明(指定目标架构和安装路径)
../configure \--target=aarch64-linux-gnu \ # 目标架构:AArch64--prefix=/opt/aarch64-sysroot/usr \ # 安装到 sysroot 的 usr 目录--with-sysroot=/opt/aarch64-sysroot \ # 关联目标 sysroot--disable-multilib \ # 禁用多架构支持--disable-nls # 禁用国际化(减少依赖)
# 配置执行
../configure --target=aarch64-linux-gnu --prefix=/opt/aarch64-sysroot/usr --with-sysroot=/opt/aarch64-sysroot --disable-multilib --disable-nls- 编译并安装
make -j$(nproc) # 多线程编译
make install # 安装到指定的 --prefix 路径
-. 验证安装结果
安装完成后,检查 aarch64-linux-gnu-as 是否生成:
ls /opt/aarch64-sysroot/usr/bin/aarch64-linux-gnu-as
- 测试程序
./aarch64-linux-gnu-gcc test.c -o test
发现执行成功不报错,就是ok了。
3.3.5 最终效果
通过以上三步,在 x86 环境中会形成一套完整的 ARM 交叉编译依赖链:
ARM应用程序 → gcc runtime库(ARM版) → glibc(ARM版) → 目标ARM系统底层接口与库
后续编译 ARM 程序时,只需指定交叉编译器(如arm-linux-gnueabihf-gcc)和sysroot路径,即可确保生成的二进制文件能在目标 ARM 系统上正常运行。
四. 核心逻辑的再梳理
交叉编译的本质是 “在 A 架构主机上生成能在 B 架构目标机运行的二进制文件”,而你提到的三个依赖项(目标底层接口、glibc、gcc 库)构成了实现这一目标的 “翻译层”:
目标底层接口:是 “翻译” 的基础 —— 定义了目标机内核能理解的 “指令集”(系统调用)。
glibc:是 “翻译” 的中间层 —— 将标准 C 函数转换为目标机内核能理解的系统调用。
gcc 库:是 “翻译” 的工具层 —— 确保编译器生成的代码符合目标机的硬件特性和 glibc 接口规范。
三者的依赖链(gcc→glibc→目标底层接口)必须严格匹配,否则会出现 “翻译错误”(如链接失败、运行时崩溃)。
4.1 实践中的关键技巧
- 优先使用成熟工具链
手动构建 glibc 和 gcc 库适合深入理解原理,但实际开发中更推荐使用厂商预编译的工具链(如 Linaro、ARM 官方工具链),这些工具链已通过严格测试,能避免版本兼容问题。例如:
# 直接使用预编译工具链,无需手动构建glibc和gcc
arm-linux-gnueabihf-gcc hello.c -o hello_arm --sysroot=/opt/arm-sysroot
-
sysroot 的统一管理
目标系统的底层接口、glibc、gcc 库应统一放置在同一个sysroot目录下(如/opt/arm-sysroot),形成 “虚拟目标根文件系统”。
编译时通过–sysroot参数指定该目录,编译器会自动从其中查找依赖,无需手动指定多个路径。 -
版本兼容性查询
若需手动搭配 gcc 和 glibc 版本,可参考官方兼容性列表:
GCC 与 glibc 兼容性:https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html
内核与 glibc 兼容性:通常要求内核版本 ≥ glibc 版本(如 glibc 2.35 需内核≥3.2)。
4.2 常见问题与排查
-
undefined reference to __NR_xxx
原因:glibc 使用的系统调用(如__NR_pwritev2)在目标内核中不存在(内核版本过低)。
解决:降低 glibc 版本,或升级目标系统内核。 -
version `GLIBC_2.xx’ not found
原因:编译时使用的 glibc 版本高于目标机实际安装的版本。
解决:使用与目标机 glibc 版本一致的交叉工具链,或在目标机升级 glibc。 -
Illegal instruction 运行时错误
原因:gcc 编译时启用了目标机不支持的硬件指令(如 ARMv7 设备使用了 ARMv8 指令集)。
解决:通过-march参数指定目标机支持的指令集(如-march=armv7-a)。 -
扩展场景
更换 C 标准库:若用 musl libc 替代 glibc,需使用针对 musl 的交叉工具链(如arm-linux-musleabihf-gcc),其构建逻辑与 glibc 类似,但无需匹配内核版本(musl 对系统调用的封装更轻量)。
嵌入式系统:部分嵌入式系统(如 uclibc-based 系统)可能不使用 glibc,此时需针对性构建适配的 C 库和 gcc 库,通常依赖厂商提供的板级支持包(BSP)。
4.3 交叉编译过程关注点理解
通常交叉编译环境中,对于这三者 目标系统的底层接口与库、交叉编译的glibc接口与库、交叉编译的gcc接口与库。
-
目标系统的底层接口,核心关注点:头文件
-
位于交叉编译系统/usr/include中的头文件,例如/opt/aarch64-kernel-headers/usr/include中的头文件;
-
这写文件编译glibc和gcc时都要使用。
主要是在glibc编译时,通过–with-headers指定:–with-headers=/opt/aarch64-kernel-headers/usr/include
当glibc编译完毕,构建的sysroot路径中,也要把这些文件copy到sysroot/user/include目录下。 -
glibc编译时,核心关注点:构建sysroot路径,形成arm版本库与头文件;
形成/opt/aarch64-sysroot目录中的结构,另外也要把系统头文件放入。形成头文件和arm库的集合sysroot目录,用于方便被gcc编译时引用。
/opt/aarch64-sysroot]$ ls
etc lib sbin usr var -
gcc编译时,核心关注点:指定关联的sysroot路径,从而用上glibc的头文件与系统头文件,并用上glibc的库;
关于系统头文件,有头文件即可;如果要关联库的话,后期是直接关联安装的系统中的。 -
安装glibc交叉编译工具,是编译的基础:yum install gcc-aarch64-linux-gnu
- 编译glibc时需要使用aarch64-gcc:
configure通过host识别要用该aarch的gcc,configure 通过 --host=aarch64-linux-gnu 识别目标架构后,会自动搜索系统中名为 aarch64-linux-gnu-gcc 的编译器。 - 编译gcc的时候也需要同时使用aarch64-gcc和本地的gcc:
configure 通过 --target=aarch64-linux-gnu 识别目标架构后,会使用 aarch64-linux-gnu-gcc作为 “临时编译器”,来编译新的 GCC 源码;同时,编译 GCC 自身在 “主机(x86_64)上运行的部分”(如编译器驱动程序)时,会使用系统自带的 x86_64 GCC(gcc)。
- 编译glibc时需要使用aarch64-gcc:
五. ARM交叉编译工具链网站linaro下载介绍
提供许多历史版本的arm-toolchain工具链下载:
https://releases.linaro.org/components/toolchain/binaries/
https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/
提供许多最新版本的arm-toolchain工具链下载:
https://snapshots.linaro.org/gnu-toolchain/
例如工具链的下载:
-
下载Linaro的aarch64交叉工具链(包含sysroot+glibc2.25+gcc7.5)
wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz -
只下载glibc交叉工具链(包含sysroot+glibc2.25)
wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/sysroot-glibc-linaro-2.25-2019.12-aarch64-linux-gnu.tar.xz.asc
注:文档部分内容由AI辅助整理生成
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)