Linux系统移植(一)--- 交叉编译工具链的配置
# Linux系统移植(一)--- 交叉编译工具链的配置
下面记录了2种交叉编译工具链的配置方法:直接下载,或者自行构建。 阅读本文,你可以配置出在x86上生成ARM的可执行文件的交叉编译器。
# 简介
# 什么是交叉编译?
交叉编译是指在一个计算机系统上生成目标计算机系统上可执行程序的过程。换句话说,它是在一台计算机上为另一种架构或操作系统生成代码的编译过程。
举例来说,如果你正在使用一台x86架构的计算机,并希望在ARM架构的嵌入式设备上运行程序,你可以使用交叉编译器在x86上生成适用于ARM的可执行文件。
# 交叉编译有什么优点?
这种方法的优势在于节省了在目标平台上进行编译的时间和资源,同时使开发者能够更轻松地在不同的硬件或操作系统上部署他们的应用程序。
# 交叉编译工具链是什么?
交叉编译工具链是一组工具的集合,用于支持交叉编译过程。这些工具包括编译器、链接器、库文件、头文件等,它们被配置和设计用于在一个平台上生成另一个平台的可执行文件。
典型的交叉编译工具链包括以下组件:
- 交叉编译器(Cross Compiler): 这是最重要的组件之一,它是用于将源代码翻译成目标平台上可执行文件的编译器。交叉编译器与目标平台的体系结构和指令集相关联。
- 交叉链接器(Cross Linker): 负责将编译后的目标文件链接成最终的可执行文件。交叉链接器需要了解目标平台的系统库和运行时环境。
- 头文件和库文件: 交叉编译工具链还包括了目标平台的头文件和库文件,以便在编译和链接过程中引用正确的函数和数据定义。
- 调试器(Debugger): 一些交叉编译工具链还包括针对目标平台的调试器,以支持在目标环境上调试生成的可执行文件。
- 配置工具: 用于配置交叉编译工具链的工具,允许开发者指定目标平台的体系结构、操作系统和其他相关参数。
# 交叉编译工具链的配置
选择适用于目标平台的交叉编译工具链。这通常包括交叉编译器、交叉链接器和相关的头文件、库文件。
你可以选择已经存在的预编译工具链,或者自行构建。
本地环境:Ubuntu22.04 开发板:aarch64
# 一、直接下载
# 下载Linaro GCC交叉编译链
Linaro是一间非盈利性的软件公司,其中最著名的软件是Linaro GCC编译工具链 Linaro GCC编译工具链:https://www.linaro.org/downloads/ 下载步骤如下: (1) 点击上面下载链接,然后点击图片中蓝色链接进入下载页面
选择版本和目标平台后复制链接,使用wget下载到Linux宿主机上(开发板以aarch64为例)
# 1.选择一个合适的目录
# 2.下载
$ wget https://snapshots.linaro.org/gnu-toolchain/14.0-2023.06-1/aarch64-linux-gnu/gcc-linaro-14.0.0-2023.06-x86_64_aarch64-linux-gnu.tar.xz
# 3.解压
$ tar -xvf gcc-linaro-14.0.0-2023.06-x86_64_aarch64-linux-gnu.tar.xz
# 4.验证解压结果(这一步也可以用gpg做asc校验文件完整性)
$ ls -al
drwxr-xr-x 8 wx wx 4096 6月 5 2023 gcc-linaro-14.0.0-2023.06-x86_64_aarch64-linux-gnu
# 5.设置到环境变量
$ echo "PATH=$PATH:<Your Path>/gcc-linaro-14.0.0-2023.06-x86_64_aarch64-linux-gnu/bin" >> ~/.bashrc
$ source ~/.bashrc
# 6.验证配置OK
$ aarch64-linux-gnu-gcc -v
...
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 14.0.0 20230605 (experimental) [master revision c7fe7ad612bb6aac1d078d215d5700ec4ef70e3c] (GCC)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
至此, Linaro GCC编译工具链下载配置成功。
# 二、自行构建
参考自crosstool-ng官方文档 https://crosstool-ng.github.io/docs/
# 1、获取crosstool-ng
从官网(http://crosstool-ng.org/)下载crosstool-ng,注意要下载官网打包好的版本,如果直接从github下载源码,源码版本主目录没有configure文件,无法配置和编译。
# 1.选择一个合适的目录
# 2.下载
$ wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.26.0.tar.xz
# 3.解压
$ tar -xvf crosstool-ng-1.26.0.tar.xz
# 4.验证解压结果(这一步也可以用gpg做asc校验文件完整性)
drwxr-xr-x 14 wx wx 4096 9月 24 10:32 crosstool-ng-1.26.0/
2
3
4
5
6
7
# 2、编译crosstool-ng
# 安装编译依赖
$ sudo apt install build-essential flex texinfo help2man gawk libtool libtool-bin bison libncurses5-dev python-dev-is-python3
$ cd crosstool-ng-1.26.0
# /some/place是crosstool-ng的安装目录
$ ./configure --prefix=/some/place
$ make
$ make install
$ export PATH="${PATH}:/some/place/bin"
# 验证编译安装OK
$ ct-ng -v
GNU Make 4.3
Built for x86_64-pc-linux-gnu
...
2
3
4
5
6
7
8
9
10
11
12
13
# 3、使用crosstool-ng构建交叉编译链
# 3.1 查看crosstoll-ng工具支持制作哪些工具模块
$ ct-ng list-samples
# 3.2 配置crosstoll-ng
下面以aarch64-unknown-linux-gnu为例作为起点后,将其加载为基础并进行微调。
$ ct-ng aarch64-unknown-linux-gnu
$ ct-ng menuconfig
2
一些常用配置和其含义
Paths and misc options --->
*** Paths ***
Local tarballs directory // 下载的源码tar包的位置,默认${HOME}/src
Working directory // 工作目录,编译中间文件的位置, 默认${CT_TOP_DIR}/.build CT_TOP_DIR是当前目录
Prefix directory // 这是工具链将被安装的位置,默认...${HOME}/x-tools...,修改时只替换${HOME}/x-tools字段即可
2
3
4
5
Target options --->
Target Architecture (arm) // 目标平台,默认arm,其他平台按需修改
2
Toolchain options --->
Tuple's vendor string // 用于你的工具链的标识符,不应包含空格或破折号。
// 例:设置为livingteam,最终二进制文件名:aarch64-livingteam-linux-gnu-gcc
2
3
# 3.3 开始编译
# crosstool-NG to override the number of jobs to 4
# .4的意思是crosstool-NG同时启4个job,加速编译,可以去掉或修改
$ ct-ng build.4
2
3
编译过程需要下载源码,网速会比较慢,大概几个小时的时间。
最终生成文件:
# 3.4 验证
# 设置环境变量,Prefix directory是上面配置的工具链被安装的位置,例:${HOME}/arm/x-tools/aarch64-livingteam-linux-gnu
$ echo "PATH=$PATH:<Prefix directory>/bin" >> ~/.bashrc
$ source ~/.bashrc
# 6.验证配置OK
$ aarch64-livingteam-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=aarch64-livingteam-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/media/wx/D/arm/x-tools/aarch64-livingteam-linux-gnu/bin/../libexec/gcc/aarch64-livingteam-linux-gnu/13.2.0/lto-wrapper
Target: aarch64-livingteam-linux-gnu
Configured with: /media/wx/D/arm/crosstool-ng/crosstool-ng-1.26.0/.build/aarch64-livingteam-linux-gnu/src/gcc/configure --build=x86_64-build_pc-linux-gnu --host=x86_64-build_pc-linux-gnu --target=aarch64-livingteam-linux-gnu --prefix=/home/wx/arm/x-tools/aarch64-livingteam-linux-gnu --exec_prefix=/home/wx/arm/x-tools/aarch64-livingteam-linux-gnu --with-sysroot=/home/wx/arm/x-tools/aarch64-livingteam-linux-gnu/aarch64-livingteam-linux-gnu/sysroot --enable-languages=c,c++ --with-pkgversion='crosstool-NG 1.26.0' --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libsanitizer --disable-libmpx --with-gmp=/media/wx/D/arm/crosstool-ng/crosstool-ng-1.26.0/.build/aarch64-livingteam-linux-gnu/buildtools --with-mpfr=/media/wx/D/arm/crosstool-ng/crosstool-ng-1.26.0/.build/aarch64-livingteam-linux-gnu/buildtools --with-mpc=/media/wx/D/arm/crosstool-ng/crosstool-ng-1.26.0/.build/aarch64-livingteam-linux-gnu/buildtools --with-isl=/media/wx/D/arm/crosstool-ng/crosstool-ng-1.26.0/.build/aarch64-livingteam-linux-gnu/buildtools --enable-lto --enable-threads=posix --enable-target-optspace --enable-plugin --enable-gold --disable-nls --disable-multilib --with-local-prefix=/home/wx/arm/x-tools/aarch64-livingteam-linux-gnu/aarch64-livingteam-linux-gnu/sysroot --enable-long-long
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 13.2.0 (crosstool-NG 1.26.0)
2
3
4
5
6
7
8
9
10
11
12
13
14
至此,自行构建的交叉编译工具链配置成功。
- 01
- Linux系统移植(五)--- 制作、烧录镜像并启动Linux02-05
- 03
- Linux系统移植(三)--- Linux kernel移植02-05