在虚拟机里安装了 Ubuntu 20.04 ARM64系统镜像用的是https://old-releases.ubuntu.com/releases/20.04.0/ubuntu-20.04-live-server-arm64.iso#准备工作#确定软件版本# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.6 LTS Release: 20.04 Codename: focal # uname -r 5.4.0-216-generic # ldd --version ldd (Ubuntu GLIBC 2.31-0ubuntu9.18) 2.31 Copyright (C) 2020 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Written by Roland McGrath and Ulrich Drepper.Binutils 版本选择的是 2.44https://mirrors.ustc.edu.cn/gnu/binutils/GCC 版本选择的是 15.1.0https://mirrors.ustc.edu.cn/gnu/gcc/gcc-15.1.0/Linux内核版本是 5.4https://mirrors.ustc.edu.cn/kernel.org/linux/kernel/v5.x/linux-5.4.tar.xzglibc版本是 2.31https://mirrors.ustc.edu.cn/gnu/glibc/glibc-2.31.tar.xz安装必要的软件包sudo apt -y install bison p7zip-full#环境变量设置必要的环境变量# 将上次制作的交叉工具链加入到 PATH 环境变量中 export PATH/opt/x86_64-w64-mingw32-15.1/bin:$PATH # 使用自编译的 GCC 库如果是用的系统的 GCC 或安装路径和我的不同就跳过这步或调整为自己的路径 export LD_LIBRARY_PATH/usr/local/lib64 export BUILDaarch64-linux-gnu export HOSTx86_64-w64-mingw32 export TARGETaarch64-linux-gnu export PREFIX/opt/cross export SYSROOT$PREFIX/$TARGET确保 GCC 版本一致# gcc -v Using built-in specs. COLLECT_GCCgcc COLLECT_LTO_WRAPPER/usr/local/bin/../libexec/gcc/aarch64-linux-gnu/15/lto-wrapper Target: aarch64-linux-gnu Configured with: ../configure --prefix/opt/gcc-15.1.0 --with-gcc-major-version-only --program-suffix-15 --enable-languagesc,c --enable-shared --enable-fix-cortex-a53-843419 --disable-werror --disable-multilib --disable-checking --buildaarch64-linux-gnu --hostaarch64-linux-gnu --targetaarch64-linux-gnu Thread model: posix Supported LTO compression algorithms: zlib gcc version 15.1.0 (GCC) # aarch64-linux-gnu-gcc -v Using built-in specs. COLLECT_GCCaarch64-linux-gnu-gcc COLLECT_LTO_WRAPPER/usr/local/bin/../libexec/gcc/aarch64-linux-gnu/15/lto-wrapper Target: aarch64-linux-gnu Configured with: ../configure --prefix/opt/gcc-15.1.0 --with-gcc-major-version-only --program-suffix-15 --enable-languagesc,c --enable-shared --enable-fix-cortex-a53-843419 --disable-werror --disable-multilib --disable-checking --buildaarch64-linux-gnu --hostaarch64-linux-gnu --targetaarch64-linux-gnu Thread model: posix Supported LTO compression algorithms: zlib gcc version 15.1.0 (GCC) # x86_64-w64-mingw32-gcc -v Using built-in specs. COLLECT_GCCx86_64-w64-mingw32-gcc COLLECT_LTO_WRAPPER/opt/x86_64-w64-mingw32-15.1/bin/../libexec/gcc/x86_64-w64-mingw32/15.1.0/lto-wrapper Target: x86_64-w64-mingw32 Configured with: ../configure --prefix/opt/cross --with-sysroot/opt/cross/x86_64-w64-mingw32 --enable-languagesc,c --enable-threadswin32 --enable-shared --disable-multilib --disable-werror --disable-checking --buildaarch64-linux-gnu --hostaarch64-linux-gnu --targetx86_64-w64-mingw32 Thread model: win32 Supported LTO compression algorithms: zlib gcc version 15.1.0 (GCC)#编译 Binutilscd /opt tar xf binutils-2.44.tar.xz cd binutils-2.44/ mkdir build cd build ../configure --prefix$PREFIX --disable-nls --disable-multilib --build$BUILD --host$HOST --target$TARGET make -j$(nproc) make install-strip#安装 Linux 内核头文件cd /opt tar xf linux-5.4.tar.xz cd linux-5.4/ make ARCHarm64 headers_install INSTALL_HDR_PATH$SYSROOT头文件会安装到$SYSROOT/include下。#编译 glibccd /opt tar xf glibc-2.31.tar.xz cd glibc-2.31/ mkdir build cd build ../configure --prefix$SYSROOT --with-headers$SYSROOT/include --disable-multilib --disable-werror --build$BUILD --host$TARGET make -j$(nproc) make install#编译 GCC关键点来了前面我们将 glibc 安装到$SYSROOT下了但是 GCC 在编译时会从$SYSROOT/usr下搜索头文件所以我们要临时创建usr目录的软链接ln -s $SYSROOT $SYSROOT/usr这样当 GCC 访问$SYSROOT/usr/include时实际访问的就是$SYSROOT/include目录。开始编译 GCCcd /opt/gcc-15.1.0/ ./contrib/download_prerequisites mkdir build cd build ../configure --prefix$PREFIX --with-sysroot$SYSROOT --enable-languagesc,c --enable-shared --enable-fix-cortex-a53-843419 --disable-multilib --disable-werror --disable-checking --build$BUILD --host$HOST --target$TARGET make -j$(nproc) make install-strip编译完成后编辑aarch64-linux-gnu/lib/libc.so文件去掉其中的绝对路径仅保留文件名。/* GNU ld script Use the shared library, but some functions are only in the static library, so try that secondarily. */ OUTPUT_FORMAT(elf64-littleaarch64) GROUP ( /opt/cross/aarch64-linux-gnu/lib/libc.so.6 /opt/cross/aarch64-linux-gnu/lib/libc_nonshared.a AS_NEEDED ( /opt/cross/aarch64-linux-gnu/lib/ld-linux-aarch64.so.1 ) )#打包7z a -l cross.7z $PREFIX好了拷贝到 Windows 上开始使用吧原文链接如下制作 Windows 上的 aarch64-linux-gnu 交叉编译器 | ashes blog