M3芯片Mac上安装arm64位ubuntu22.04并编译交叉工具链gcc4.9.2

  • 一.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

gcc/cp/Make-lang.in

gcc/cp/cfns.gperf

gcc/cp/cfns.h

gcc/cp/except.c

Making sure you're not a bot!https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=ec1cc0263f156f70693a62cf17b254a0029f4852

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值