-
一.ubuntu安装
1.安装arm64位的vmware fusion虚拟机。
2.安装arm版的ubuntu22.04。
安装好后更新源,可以参考下面:
deb http://mirrors.aliyun.com/ubuntu-ports/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu-ports/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu-ports/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu-ports/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu-ports/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu-ports/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu-ports/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu-ports/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu-ports/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu-ports/ focal-backports main restricted universe multiverse
3.安装vmware-tools
打开终端输入:
sudo apt-get install open-vm-tools-desktop
这个工具只可以复制粘贴命令,文件不行。
-
二.编译arm64下的交叉编译环境
环境:arm64位的ubuntu22.04,gcc版本:11.4.0
目标版本:
gcc 版本 4.9.2
glibc 版本 2.20
Binutils 版本 2.25
target: arm-none-linux-gnueabi
编译过程中提示缺少xxx工具,不算错误,根据提示安装相应工具;如果特定工具无法通过命令行的形式安装(找不到源),通过编译源码的形式安装。
编译方法:
1.起初使用手动下载源码分别在命令行下编译gcc、binutils和glibc。
下载源码并解压
Binutils 2.25
wget https://ftp.gnu.org/gnu/binutils/binutils-2.25.tar.gz
gcc 4.9.2
wget https://ftp.gnu.org/gnu/gcc/gcc-4.9.2/gcc-4.9.2.tar.gz
glibc 2.18
wget https://ftp.gnu.org/gnu/glibc/glibc-2.18.tar.gz
编译顺序
(1)binutils
此部分编译会很顺利,除了报一些缺少xxx软件或者库,根据提示安装。
(2)准备内核头文件
(3)编译 GCC(此步骤只编译gcc部分,不包括g++)
此处只能通过命令make -j$(nproc) all-gcc和make install-gcc安装gcc,如果用make 编译libgcc部分会依赖报错:
致命错误:libio/stdio.h:没有那个文件或目录
# include <libio/stdio.h>,
该部分依赖于glibc部分还未编译。
利用make install-gcc此处gcc基本部分已经编译安装完成,可以正常输出版本号。
(4)glibc
除了依赖特定版本工具之外最大的问题是:
链接器找不到libgcc库,而libgcc库的编译又依赖于glibc。到此处问题出现了,编译glibc和gcc之间相互依赖,编译报错形成闭环。这种纯手动下载源码用命令行编译的方法耗时有费力,而且在系统较新交叉工具版本较老的情况下特别不推荐,报错乱七八糟又不兼容,报错了又查不到什么资料。捣鼓了三四天还是编不过,果断放弃。主要看下面的方法。
2.使用crosstool-ng工具进行编译
crosstool-ng是一个专门用于构建 交叉编译工具链的工具。有好几个版本,每个版本支持的库版本不一样,我们选择1.22,这个glibc和Binutils都有对应版本,我们只需手动添加gcc4.9.2的源码,修改下工具的配置源码即可。其他版本都需要手动添加更多的库,报错问题只会更多。
(1)安装依赖
sudo apt-get update
sudo apt-get install -y autoconf automake bison bzip2 coreutils flex gcc git g++ \
gperf help2man libncurses5-dev libtool patchutils python3 quilt rsync wget \
texinfo
(2)下载并解压 crosstool-ng
wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.22.0.tar.bz2
tar xjf crosstool-ng-1.22.0.tar.bz2
cd crosstool-ng-1.22.0
(3)配置编译并安装 crosstool-ng
1)
./configure --prefix=/usr/local
报错:configure: error: could not find bash >= 3.1
安装满足要求的bash版本,系统bash版本是5.1,满足要求,但还是会报错,强制修改绕过版本检查:
if ${ac_cv_path__BASH+:} false; then :
$as_echo_n "(cached) " >&6
else
修改为;
ac_cv_path__BASH=/bin/bash
2)make
编译源码报错:函数定义和声明形参不一样
vi ./kconfig/zconf.hash.c +34
修改为:
static const struct kconf_id *kconf_id_lookup(register const char *str, register size_t len);
3)sudo make install
(4)开始交叉工具链的搭建,进入crosstool-ng修改配置项
1)发现gcc4.9.2没得选:
vi ./config/cc/gcc.in +51 在后面加上这几行,重新编译安装就有了,顺便将gcc-4.9.2源码放到crosstool-ng/.build/tarballs路径下。
config CC_GCC_V_4_9_2
bool
prompt "4.9.2"
select CC_GCC_4_9
2)输入ct-ng menuconfig,配置选项
Target options ->
Target Architecture (arm)
Emit assembly for CPU 这项切记不填(只针对于本套交叉工具链,填了c++pthread会报错)
Floating point: (software (no FPU)) (选软件模拟浮点运算)
Toolchain options->
(none) Tuple's vendor string
Operating System->
Target OS (linux)
Linux kernel version (2.6.32.68) (根据需求选择)
Binary utilities ->
binutils version (2.25)
C-library ->
C library (glibc)
glibc version (2.20)
C compiler (gcc)->
gcc version (4.9.2)
[*] C++ (按空格选中)
Debug facilities ->
[ ] gdb (按需选择)
保存退出
ct-ng build编译
编译前会去下载相应的库,通常需要几个小时,可以手动下载目标库到crosstool-ng/.build/tarballs这个路径下,这样比较快。编译会报错,会重复的修改后清理并重新编译,为了不让他每次重新编译时都去下载,将这个目录下的拷贝一份,重新编译时,直接将备份的压缩包考到该路径下,他会检测跳过下载步骤,节省时间。
(5)编译报错:详细报错到build.log文件查看
1)下载 isl-0.14(GCC 依赖的数学)时失败,手动下载放到crosstool-ng/.build/tarballs/
wget https://libisl.sourceforge.io/isl-0.14.tar.bz2
2)无法从默认的 FTP 镜像找到该版本
手动下载放到crosstool-ng/.build/tarballs/
wget http://ftp.gnu.org/gnu/gcc/gcc-4.9.2/gcc-4.9.2.tar.bz2
手动下载的还是会一直报这个错,是因为crosstool-ng 会检查文件的 SHA256 或 MD5 校验值。如果手动下载的文件与预期不符,会拒绝使用。从不同地方多下几个试试,发现就可以了。
3)找不到兼容的 ISL (Integer Set Library) 版本,之前下的0.14版本不兼容。
我们就下他说的0.12放到crosstool-ng/.build/tarballs/下。并把.config文件的0.14版本的配置项也改成0.12
4)GCC 4.9.2 源码不兼容较新的编译器,spill_indirect_levels是bool类型不支持++运算。
源码被解压到了crosstool-ng/.build/src/这个目录下,vi gcc-/gcc/reload1.c +444
注释spill_indirect_levels++;修改成:
5)70106 [ALL ] /usr/bin/ar: libbackend.a: No space left on device
磁盘空间不足,提前将默认分配的20G空间扩容,不然到后面连build.log都看不了。
6)gcc源码不兼容,error: 'const char* libc_name_p(const char*, unsigned int)'
参考以下链接对这五个文件进行修改:
gcc/cp/ChangeLog
7)构建过程中缺少 Python 2.x 环境,而工具链中的某些组件需要 Python 2.x 支持。
我们装2.7,如果系统有多个版本的python
使用 update-alternatives 管理python版本
# 注册 Python 2 和 Python 3 到 alternatives 系统
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 2
通过sudo update-alternatives --config python 命令来手动选择所需版本
出现这个就表示编译安装成功
(6)将交叉编译工具链添加到环境变量
vi ~/.bashrc
export PATH=$PATH:xxxxxxxxxx/arm-none-linux-gnueabi/bin,后面路径是自己刚开始选的啥就是啥。
source ~/.bashrc