通过SSH登录建立的ubuntu-22.04.3虚拟机环境,新建文件夹并进入
mkdir arm && cd arm
mkdir crosstool-ng && cd crosstool-ng
下载http://crosstool-ng.org
wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.26.0.tar.bz2
或直接访问网址下载源码,通过FTP上传至/arm/crosstool-ng目录下,运行解压命令。
tar -xjvf crosstool-ng-1.26.0.tar.bz2
进入/crosstool-ng-1.26.0目录,查看目录下结构
在/opt目录下新建/crosstool-ng目录
sudo mkdir /opt/crosstool-ng
查看路径,确保当前进入/crosstool-ng-1.26.0目录,运行配置命令,这里通过–prefix指定crosstool-ng安装目录为/opt/crosstool-ng
./configure --prefix=/opt/crosstool-ng
不出意外的话应该会报错
从报错信息可知缺少可用的C编译器
configure: error: in `/home/tzw/arm/crosstool-ng/crosstool-ng-1.26.0':
configure: error: no acceptable C compiler found in $PATH
通过命令查看确实没有安装gcc,如果安装gcc的话会输出gcc版本
gcc -v
这里我们不直接安装gcc,通过安装build-essential同时安装gcc、g++、make等依赖项,build-essential 是编译程序的基础软件包,通过命令可查看build-essential依赖关系
apt-cache depends build-essential
安装build-essential
sudo apt install build-essential
安装完成后再次运行命令,不出意外的话应该还会报错
./configure --prefix=/opt/crosstool-ng
这次是缺少flex词法分析器工具,因此安装flex
sudo apt install flex
……
按照上述步骤进行,直至将crosstool-ng所有依赖软件包安装完毕。
运行configure配置成功输出结果
sudo apt install build-essential flex texinfo help2man gawk libtool libtool-bin bison libncurses5-dev
确认当前路径为/crosstool-ng-1.26.0,执行命令
./configure --prefix=/opt/crosstool-ng
make
sudo make install
安装完成后在/opt/crosstool-ng/bin路径下生成可执行文件文件ct-ng
将其添加到环境变量PATH中,可以直接修改~/.bashrc文件,也可以使用如下命令,.bashrc文件位于当前登录用户默认home路径下
echo "PATH=$PATH:/opt/crosstool-ng/bin" >> ~/.bashrc
source ~/.bashrc
查看环境变量PATH,确认添加成功
$PATH
并查看是否安装成功
ct-ng -v
GNU Make 4.3
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
使用crosstool-ng可以通过用户界面菜单进行配置,也可以使用源码中自带的配置文件,这里使用源码中自带的配置文件,并通过用户界面菜单进行修改。
在/crosstool-ng-1.26.0/samples路径下,保存了各类CPU制作交叉编译工具链的示例配置文件
ls samples
或者
ct-ng list-samples
这里以Armv8-A处理器中的Cortex-A53为例,ARM Cortex-A53是一款基于ARMv8指令系统的八级流水线结构处理器。在28nm HPM制造工艺下、运行SPECint2000测试时,单个核心的功耗不超过0.13W,主频可达1.5Ghz。其推出市场之初,是世界上能耗比最高、面积最小的64位应用处理器。
Cortex-A53为基于ARMv8-A架构的64位CPU,拥有2种执行模式,AArch64和AArch32,因此选择/crosstool-ng-1.26.0/samples/aarch64-rpi3-linux-gnu/crosstool.config配置文件为基础进行配置。查看文件内容
cat aarch64-rpi3-linux-gnu/crosstool.config
CT_CONFIG_VERSION="4"
CT_ARCH_ARM=y
CT_ARCH_CPU="cortex-a53"
CT_ARCH_64=y
CT_TARGET_VENDOR="rpi3"
CT_KERNEL_LINUX=y
CT_BINUTILS_LINKER_LD_GOLD=y
CT_BINUTILS_GOLD_THREADS=y
CT_BINUTILS_LD_WRAPPER=y
CT_BINUTILS_PLUGINS=y
CT_CC_LANG_CXX=y
CT_DEBUG_GDB=y
前几项意义很明确,后几项意义如下
在/crosstool-ng路径下新建src、crosstool-build、x-tools文件夹,并将/crosstool-ng-1.26.0/samples/aarch64-rpi3-linux-gnu/crosstool.config文件复制到/crosstool-ng路径下,重命名为.config,后续将在/crosstool-ng路径下进行制作,即${CT_TOP_DIR}=~/arm/crosstool-ng
cd ~/arm/crosstool-ng
mkdir src crosstool-build x-tools
cp crosstool-ng-1.26.0/samples/aarch64-rpi3-linux-gnu/crosstool.config .config
运行命令,进入用户界面菜单配置,在每个配置项条目上按下?将显示帮助信息。
对于需要配置的地方,在后续小节中使用加粗显示,其它条目仅进行介绍或略过。 < Select > 进入当前选项中进行详细设置, < Exit > 退出到上一层级, 修改过程中及时使用 < Save > 保存,避免丢失配置。
cd ~/arm/crosstool-ng
ct-ng menuconfig
Crosstool-NG behavior:
Paths:
Downloading:
配置源码包相关下载、校验等选项,全部保持默认即可,由于让crosstool-ng自己下载源码包太慢,后续会直接从镜像源进行下载并保存至src路径下。
Extracting:
源码包解压相关选项,保持默认即可。
Logging:
构建过程日志相关选项,保持默认即可。
Target Architecture:选择arm.
Options for arm:
Generic target options:
Target optimisations:
General toolchain options:
Tuple completion and aliasing:
Toolchain type:
默认设置为Cross,表示交叉编译。
Build system:
保持默认状态。
均保持默认(后续再看)。
选择gdb,其它保持默认。
配套库,这里可以查看构建工具链所需的部分库,可以根据此处列表提前下载各项源码。
expat-2.5.0
gettext-0.21
gmp-6.2.1
isl-0.26
libconv-1.16
mpc-1.2.1
mpfr-4.2.1
ncurses-6.4
zlib-1.2.13
zstd-1.5.5
默认都不选择
完成配置后进行保存 < Save > ,然后退出 < Exit > 。
依次下载所需源码压缩包,其中大部分压缩包可在镜像源网站上的gnu目录下找到,并保存在~/arm/crosstool-ng/src路径下。
binutils工具集指令
指令 | 描述 |
---|---|
addr2line | 根据指令地址获取对应的函数、源文件名、行号 |
nm | 列出程序文件中的符号以及在内存中的地址 |
readelf | 显示有关ELF二进制文件的信息 |
size | 查看目标文件中的段大小 |
objcopy | 将一种对象文件翻译成另外一种 |
objdump | 查看程序段信息以及反汇编 |
strip | 剔除可执行程序中的调试信息 |
ar | 将目标文件打包成静态库 |
ld | 链接器 |
ranlib | 生成文件的索引,加快查找速度 |
在~/arm/crosstool-ng路径下执行ct-ng build命令
cd ~/arm/crosstool-ng
ct-ng build
然后就是等待……
等待……
等待……
经过65min23s的等待(4-core@2GHz),迎来了……报错(?_?)
啊???????????????????????????????????????
这个错误查了很久,最后在crosstool-ng的issue里找到了:no usable python found at /usr/bin/python3
·
按照描述安装python-dev-is-python3即可
sudo apt install python-dev-is-python3
然后因为前面配置的时候在Debug crosstool-NG选项中设置了Save intermediate steps,因此可以直接使用命令继续build,查看报错输出信息之前最后一次保存构建状态
Saving state to restart at step 'libc_post_cc'...
Saving state to restart at step 'companion_libs_for_target'...
Saving state to restart at step 'binutils_for_target'...
Saving state to restart at step 'debug'...
因此输入下述命令可从step debug继续运行
ct-ng build RESTART=debug
最后一共经过95min12s的等待,编译完成,生成的交叉编译工具链位于~/arm/crosstool-ng/x-tools/aarch64-tzw-linux-gnu路径下
查看aarch64-tzw-linux-gnu-gcc版本
cd ~/arm/crosstool-ng/x-tools/aarch64-tzw-linux-gnu/bin
./aarch64-tzw-linux-gnu-gcc -v
Target: aarch64-tzw-linux-gnu
Configured with:
/home/tzw/arm/crosstool-ng/crosstool-build/aarch64-tzw-linux-gnu/src/gcc/configure
--build=x86_64-build_pc-linux-gnu
--host=x86_64-build_pc-linux-gnu
--target=aarch64-tzw-linux-gnu
--prefix=/home/tzw/arm/crosstool-ng/x-tools/aarch64-tzw-linux-gnu
--exec_prefix=/home/tzw/arm/crosstool-ng/x-tools/aarch64-tzw-linux-gnu
--with-sysroot=/home/tzw/arm/crosstool-ng/x-tools/aarch64-tzw-linux-gnu/aarch64-tzw-linux-gnu/sysroot
--enable-languages=c,c++
--with-cpu=cortex-a53
--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=/home/tzw/arm/crosstool-ng/crosstool-build/aarch64-tzw-linux-gnu/buildtools
--with-mpfr=/home/tzw/arm/crosstool-ng/crosstool-build/aarch64-tzw-linux-gnu/buildtools
--with-mpc=/home/tzw/arm/crosstool-ng/crosstool-build/aarch64-tzw-linux-gnu/buildtools
--with-isl=/home/tzw/arm/crosstool-ng/crosstool-build/aarch64-tzw-linux-gnu/buildtools
--enable-lto
--enable-threads=posix
--enable-target-optspace
--enable-plugin --enable-gold
--disable-nls
--disable-multilib
--with-local-prefix=/home/tzw/arm/crosstool-ng/x-tools/aarch64-tzw-linux-gnu/aarch64-tzw-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)
交叉编译工具链制作成功!
本章完结撒花??ヽ(°▽°)ノ?