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

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)。

五. 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)

http://www.dtcms.com/a/316202.html

相关文章:

  • makefile的使用与双向链表
  • 使用YOLOv8-gpu训练自己的数据集并预测
  • 多传感器融合
  • 2025暑期作业
  • 企业如何用现代数仓架构挖掘新业务盈利点?AllData产品从目标、路径、结果给出答案
  • 分布式文件系统06-分布式中间件弹性扩容与rebalance冲平衡
  • 集成学习与随机森林:从原理到实践指南
  • 解决VScode无法打开本地文件夹及远程连接后无反应的问题
  • Maven和Gradle在构建项目上的区别
  • 范式集团与海博思创成立合资公司,杀入“AI+储能”赛道
  • 机器学习之KNN、贝叶斯与决策树算法
  • 【题解】P3172 [CQOI2015] 选数(倍数莫反做法)
  • 深圳多奥500KG磁力锁(DAIC-MJ-500S)技术解析与产品优势报告,应用到门禁系统坚若磐石!
  • 计算机网络 第2章通信基础(竟成)
  • Pycaita二次开发基础代码解析:参数化模板创建与设计表驱动建模
  • 【Java面试题】注解,异常相关知识
  • Go语言的gRPC教程-错误处理
  • Android AppSearch 深度解析:现代应用搜索架构与实践
  • Elasticsearch向量库
  • 【web应用】前后端分离项目基本框架组成:Vue + Spring Boot 最佳实践指南
  • 深度解析 TCP 三次握手与四次挥手:从原理到 HTTP/HTTPS 的应用
  • 微服务—OpenFeign
  • Spring中七种Propagation类的事务属性详解
  • 研发团队看板协作中的自动化实践:集成CI/CD与任务流转
  • 007TG洞察:高效运营Telegram私域流量:技术挑战与自动化解决方案探索
  • 中科米堆CASAIM自动化三维扫描系统自动测量压铸件尺寸
  • 【原创】基于gemini-2.5-flash-preview-05-20多模态模型实现短视频的自动化二创
  • 从 “看懂图” 到 “读懂视频”:多模态技术如何用文本反哺视觉?
  • 原型模式在C++中的实现与面向对象设计原则
  • 二维数点问题 1