本文将在一个纯净的Ubuntu 22.04 LTS 下构建ARM交叉编译器,GCC版本为11.1.0。
必需的依赖项:

sudo apt-get install bison
sudo apt-get install texinfo
sudo apt-get install build-essential
sudo apt-get install make
sudo apt-get install gawk

创建工作文件夹并进入

mkdir cross
cd cross

本文采用的软件包版本为:binutils-2.38, GCC-11.1.0, linux-kernel-5.10.5, glibc-2.33
下载软件包:

wget http://ftpmirror.gnu.org/binutils/binutils-2.38.tar.gz
wget http://ftpmirror.gnu.org/gcc/gcc-11.1.0/gcc-11.1.0.tar.gz
wget https://mirrors.tuna.tsinghua.edu.cn/kernel/v5.x/linux-5.10.5.tar.xz
wget http://ftpmirror.gnu.org/glibc/glibc-2.33.tar.xz
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/cloog-0.18.1.tar.gz

下载完成后,提取文件:

for f in *.tar*; do tar xf $f; done

进入GCC目录,下载GCC依赖项:

cd gcc-11.1.0
./contrib/download_prerequisites

该过程会自动下载gmp、mpfr、mpc和isl。
将cloog链接到GCC目录:

ln -s ../cloog-0.18.1 cloog

选择一个安装目录,并确保对它有写权限。在接下来的步骤中,将把新的工具链安装到/opt/cross

sudo mkdir /opt/cross
sudo chmod -R 777 /opt/cross

在接下来的步骤中,需要用到已经安装到/opt/cross/bin中的工具,因此需要将/opt/cross/bin添加到环境变量中。这里推荐修改~/.bashrc文件,因为修改后可以立即生效,而且对全局有效。

sudo vim ~/.bashrc
export PATH=/opt/cross/bin:$PATH
source ~/.bashrc

检查环境变量是否生效:

echo $PATH

至此,准备工作完成,接下来开始安装。建议所有操作在root用户下进行,以免出现问题。

1.Binutils

此步骤构建并安装交叉汇编器、交叉链接器和其他工具。

mkdir build-binutils
cd build-binutils
../binutils-2.38/configure --prefix=/opt/cross --target=aarch64-linux --disable-multilib
make -j4
make install
cd ..

–prefix 为工具安装的目标位置
–taeget 为目标工具的名称
–disable-multilib 表示只安装aarch64,不兼容32位

2.Linux内核头文件

这个步骤将Linux内核头文件安装到/opt/cross/aarch64-linux/include,从而允许我们构建的交叉编译器编译出的程序能够进行系统调用。

cd linux-5.10.5/
make ARCH=arm64 INSTALL_HDR_PATH=/opt/cross/aarch64-linux headers_install
cd ..

3.编译器

这一步将构建GCC的交叉编译器,并将它们安装到/opt/cross/bin。

mkdir build-gcc
cd build-gcc
../gcc-11.1.0/configure --prefix=/opt/cross --target=aarch64-linux --enable-languages=c,c++,fortran,objc,obj-c++ --disable-multilib
make -j4 all-gcc
make install-gcc
cd..

–prefix 指定安装位置
–target 指定目标交叉编译i器,同时,构建的交叉编译器也会以aarch64-linux为前缀
–enable-languages 指定支持的编程语言
–disable-multilib 表示只支持64位,不兼容32位

4.标准C库头文件和启动文件

这一步中将Glibc的标准C库头文件安装到/opt/cross/aarch64-linux/include,并使用步骤3中内置的C编译器来编译库的启动文件,并将它们安装到/opt/cross/aarch64-linux/lib。

mkdir build-glibc
cd build-glibc
../glibc-2.33/configure --prefix=/opt/cross/aarch64-linux --build=$MACHTYPE --host=aarch64-linux --target=aarch64-linux --with-headers=/opt/cross/aarch64-linux/include --disable-multilib libc_cv_forced_unwind=yes
make install-bootstrap-headers=yes install-headers
make csu/subdir_lib
install csu/crt1.o csu/crti.o csu/crtn.o /opt/cross/aarch64-linux/lib
aarch64-linux-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o /opt/cross/aarch64-linux/lib/libc.so
touch /opt/cross/aarch64-linux/include/gnu/stubs.h
cd ..

–prefix 指定安装位置
–host和–target指定glibc库最终运行的系统
–with-headers指定内核头文件,即第2步中我们安装的linux内核头文件
详细信息可使用如下命令查看:

../glibc-2.33/configure --help

5.编译器支持库

编译器支持库包含一些C++异常处理样板代码。

cd build-gcc
make -j8 all-target-libgcc
make install-target-libgcc
cd ..

6.标准C库

在这一步中构建标准C库并将其文件安装到 /opt/cross/aarch64-linux/lib/。静态库名为libc.a,共享库名为libc.so。

cd build-glibc
make -j8
make install
cd ..

7.标准C++库

这一步构建了标准的C++库并安装到/opt/cross/aarch64-linux/lib64/。生成的静态库名为libstdc++.a,共享库为 libstdc++.so。

cd build-gcc
make -j8
make install
cd ..

这里可能会报错,提示PATH_MAX未定义

../../../../gcc-11.1.0/libsanitizer/asan/asan_linux.cpp: 在函数‘void __asan::AsanCheckIncompatibleRT()’中:
../../../../gcc-11.1.0/libsanitizer/asan/asan_linux.cpp:199:21: 错误:‘PATH_MAX’在此作用域中尚未声明199 |       char filename[PATH_MAX];|                     ^~~~~~~~
../../../../gcc-11.1.0/libsanitizer/asan/asan_linux.cpp:200:35: 错误:‘filename’ was not declared in this scope; did you mean ‘rename’?200 |       MemoryMappedSegment segment(filename, sizeof(filename));|                                   ^~~~~~~~|                                   rename
make[4]: *** [Makefile:654:asan_linux.lo] 错误 1

解决方法为:

cd gcc-11.1.0/libsanitizer/asan
vim asan_linux.cpp

在打开的文件前面添加如下代码:

#ifndef PATH_MAX
#define PATH_MAX 4096
#endif

保存后退出,重新编译即可。

8.测试

aarch64-linux-gcc -v

出现如下信息即表示构建成功:

使用内建 specs。
COLLECT_GCC=aarch64-linux-gcc
COLLECT_LTO_WRAPPER=/opt/cross/libexec/gcc/aarch64-linux/11.1.0/lto-wrapper
目标:aarch64-linux
配置为:../gcc-11.1.0/configure --prefix=/opt/cross --target=aarch64-linux --enable-languages=c,c++,fortran,objc,obj-c++ --disable-multilib
线程模型:posix
Supported LTO compression algorithms: zlib
gcc 版本 11.1.0 (GCC)

Ubuntu构建ARM交叉编译器相关推荐

  1. ARM 交叉编译器安装

    ARM 交叉编译器安装: 1. 交叉工具下载 下载链接: ARM-交叉编译工具 笔者下载的这一个:gcc-arm-none-eabi-10.3-2021.07-x86_64-linux.tar.bz2 ...

  2. Linux安装arm交叉编译器

    Linux安装arm交叉编译器 总结一下Linux(本文是基于Ubuntu16.04 64位版)下arm交叉编译工具链的安装及配置步骤,按照此顺序可以避免很多不必要的错误. 注意:建议在执行以下所有命 ...

  3. Linux下安装和配置ARM交叉编译器

    本篇为基于Linux-Ubuntu20.04下配置安装ARM交叉编译器,"arm-linux-gcc交叉编译器"云盘链接放置文章底部,有需要可自提 1. 第一步 在windows下 ...

  4. arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf的区别

    命名规则 交叉编译工具链的命名规则为:arch [-vendor] [-os] [-(gnu)eabi] [-gcc] arch – 体系架构,如ARM,MIPS vendor – 工具链提供商 os ...

  5. arm交叉编译器gnueabi、none-eabi、arm-eabi等的区别

    交叉编译工具链的命名规则为:arch [-vendor] [-os] [-(gnu)eabi] arch – 体系架构,如ARM,MIPS vendor – 工具链提供商 os – 目标操作系统 ea ...

  6. 嵌入式ARM交叉编译器安装

    1.开发平台 虚拟机:VirtualBox 操作系统:Ubuntu 16.04 64bit 2.准备ARM交叉编译工具包 编译uboot和linux kernel都需要ARM交叉工具链支持,这里使用L ...

  7. 【物联网】 Ubuntu中生成交叉编译器xtensa-lx106-elf

    要在PC上开发ESP8266,无论是Linux还是Windows首先需要有一套交叉编译环境,才能将编写好的代码编译成可在ESP8266上固化和运行的bin文件.官方提供了已编译完成的Linux下的交叉 ...

  8. ubuntu 10.04 安装arm交叉编译器

    家里有一台cotext-A9(armv7-a) 的盒子,现在不用了, 一直想着废物利用.于是想怎么为这盒子编译程序. 目标机器: root@routon-h1:/# uname -a Linux ro ...

  9. linux命令详解(arm交叉编译器)

    PC机用的win10,虚拟机使用的是VMware12,Linux版本是redhat6. 1.arm-linux-gcc  编译器 举例:arm-linux-gcc  hello.c –o  hello ...

  10. arm交叉编译器下载

    怎么就这一种... gcc-arm-none-eabi 类型下载 https://developer.arm.com/open-source/gnu-toolchain/gnu-rm 下载链接 gcc ...

最新文章

  1. hihocoder 1152 Lucky Substrings
  2. select,epoll,poll比较
  3. R语言dim函数返回NULL
  4. android支付宝插件,GitHub - DmcSDK/cordova.plugin.alipay: cordova 支付宝支付插件,支持IOS Android。...
  5. linux内核二当家,Linux PWN从入门到熟练(二)
  6. jquery sortable的拖动方法内容说明和示例详解(转载http://www.jb51.net/article/45803.htm)
  7. ​Go 能取代 Java,成为下一个 10 年的王者吗?​
  8. 谈谈Hybird3D中的光栅化优化
  9. 在Asp.net网页中使用接口
  10. 滴滴是如何搭建起PB级数据中台的?
  11. 圣诞节美食聚会派对海报设计
  12. 共享内存及其用mmap实现共享内存
  13. 天翼云高可用虚拟IP(HAVIP)实践
  14. Asprise OCR v4.0 64位破解...仅供学习使用
  15. 头歌 1.Pandas安装与对象使用
  16. 关于MySql中explain结果filtered的理解
  17. C语言如何编程换算小时秒,小时分钟秒的换算(c语言把时间转换成秒)
  18. Dharma勒索病毒变种 ---加密后文件后缀.bkpx
  19. 沁恒CH32V103C8T6(二): Linux RISC-V编译和烧录环境配置
  20. PMP学习笔记 第7章 项目成本管理

热门文章

  1. rtthread qspi w25q256
  2. java监控网卡流量_流量监控脚本监控网卡
  3. 单文件小型数据库的选择
  4. 计算机网络自顶向下方法第七版第六章答案,《计算机网络 自顶向下方法》(第7版)答案(第六章)(一)...
  5. Locahost和本地IP地址有什么区别?
  6. jflash合并bin文件及hex文件
  7. 检定规程JJG687- 2008《液态物料定量灌装机》解析
  8. 残差灰色模型matlab,数学建模+灰色预测模型+MATLAB详解.doc
  9. c语言取反运算详细步骤,C语言取反运算~
  10. R语言4.04安装教程