Ubuntu构建ARM交叉编译器

2023-05-16

本文将在一个纯净的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) 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ubuntu构建ARM交叉编译器 的相关文章

  • 什么是遗留中断?

    我正在开发一个项目 试图弄清楚 ARM 架构的全局中断控制器中如何处理中断 我正在使用 pl390 中断控制器 我看到有一条线被称为传统中断 它绕过了分配器逻辑 假设有 2 个中断可以被编程为传统中断 任何人都可以帮助解释一下什么是遗留中断
  • 如何在 Ubuntu VirtualBox 中运行 Meteor 应用程序并使用 Windows 主机上的编辑器进行编辑?

    我希望在运行 Ubuntu 的 virtualbox 来宾中运行一个用于开发目的的流星服务器 该项目将位于主机上的一个文件夹内 该文件夹将共享给来宾 该文件夹本身位于 Dropbox 文件夹内 这样我可以在多个虚拟机和工作站之间共享开发 但
  • pip:需要将包名称tensorflow-gpu更改为tensorflow

    我正在尝试将具有 GPU 支持的张量流安装到 conda 环境中 我使用命令 pip install ignore installed upgrade https storage googleapis com tensorflow linu
  • nslookup 报告“无法解析 '(null)': 名称无法解析”,尽管它成功解析了 DNS 名称

    我在 ubuntu 上 并且正在运行 docker 默认桥接网络 我有 Zookeeper kafka 的容器化版本 以及我编写的与 kafka 对话的应用程序 I do a docker exec it
  • 卷曲选项 -:未知

    我运行此命令在 ubuntu 18 04 上安装更新版本的 nodejs curl sL https deb nodesource com setup 12 x sudo E bash 我收到错误 curl 选项 未知 我在多个系统上尝试过
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • ARM NEON 矢量化失败

    我想在 ARM cortex a9 上启用 NEON 矢量化 但在编译时得到以下输出 未矢量化 不支持相关 stmt D 14140 82 D 14143 77 D 14141 81 这是我的循环 void my mul float32 t
  • 如何查看 Ubuntu 上的 Binutils 版本?

    我已经搜索过 但没有找到一个选项来告诉我我的 Ubuntu 上有哪个版本的 binutils 或者至少我不知道如何解释它 gcc v 没有透露任何有关 binutils 的信息 ld v 告诉我GNU ld GNU Binutils for
  • git 错误:无法处理 https

    当我尝试使用 git clone 时https xxx https xxx我收到以下错误我不处理协议 https 有人可以帮我吗 完整消息 dementrock dementrock A8Se git 克隆https git innosta
  • 如何在WinMobile6上启用ARMv6非对齐访问?

    ARMv6 引入了一个很棒的功能 未对齐的内存访问 这使得代码中的某些事情变得更加简单和更快 但微软只在winCE6中提供了API 现在大多数 PDA 都基于 WinMobile6 基于 CE 5 x 默认情况下禁用未对齐访问 我尝试在 C
  • 让 TensorFlow 在 ARM Mac 上使用 GPU

    我已经安装了TensorFlow在 M1 上 ARM Mac 根据这些说明 https github com apple tensorflow macos issues 153 一切正常 然而 模型训练正在进行CPU 如何将培训切换到GPU
  • 可以对 Xcode 中的 Arm 架构设置进行一些澄清

    据我了解 iPhone 5将采用新的架构 armv7s 我的项目具有有效的架构armv7 并且有Build Active Architecture Only set to true 由于现在商店中的每个应用程序都是为armv6 and or
  • 运行此处编译的 C 程序会导致在另一台服务器上找不到 GLIBC 库错误 - 是我的错还是他们的错?

    此处编译的 C 程序在我们的 Ubuntu 服务器上运行良好 但是当其他人尝试在他们的特定 Linux 服务器上运行它时 他们会收到以下错误 myprog install lib tls libc so 6 version GLIBC 2
  • Python子进程Exec格式错误

    抱歉 如果这个问题很愚蠢 我正在使用Pythonsubprocess在 Ubuntu Natty 11 04 中调用 bat 文件的语句 但是 我收到错误消息 Traceback most recent call last File pfa
  • dpkg 错误:pycompile:未找到

    sudo apt get remove purge mysql server mysql client mysql common 当我尝试使用上述命令删除 mysql 时 出现以下错误 Reading package lists Done
  • Docker Desktop 未安装,提示 docker-ce-cli 无法安装

    在一次在线培训课程中 讲师提到他有 安装了 Docker Desktop 的 Ubuntu 虚拟机 因此 我尝试在 Windows 10 物理主机上安装相同的程序指示 https docs docker com desktop linux
  • GCC:如何在 MCU 上完全禁用堆使用?

    我有一个在基于 ARM Cortex M 的 MCU 上运行并用 C 和 C 编写的应用程序 我用gcc and g 编译它并希望完全禁用任何堆使用 在 MCU 启动文件中 堆大小已设置为 0 除此之外 我还想禁止代码中意外使用堆 换句话说
  • 静态 OpenCV 库中未定义的引用

    我有一个使用 OpenCV 3 1 的 C 项目 并且使用共享库可以正常工作 但现在我想使用静态库 位于项目目录中的文件夹中 来编译它 因为我希望能够在未安装 OpenCV 的情况下导出它 如果需要还可以编辑和重新编译 这次我重新编译了 O
  • aarch64 Linux 硬浮点或软浮点

    linux系统有arm64 有arm架构armv8 a 如何知道 Debian 运行的是硬浮动还是软浮动 符合 AAPCS64 GNU GCC for armv8仅提供硬浮动aarch64工具链 这与 armv7 a 的 GCC 不同 后者
  • Eclipse Kepler 在 64 位 ubuntu 上冻结

    几天前我刚刚将 Ubuntu 升级到 14 04 并在此过程中从 32 位切换到 64 位 从那时起 Eclipse 就变得非常不稳定 运行几分钟后 它将开始随机冻结越来越长的时间 特别是在代码完成时 已经必须禁用它 而且在剪切 粘贴时 偶

随机推荐