当前位置: 首页 > 工具软件 > GNU texinfo > 使用案例 >

aarch64-linux-gnu_交叉编译工具链

郦祺
2023-12-01

1、.tar.xz 文件

工具链下载:https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/_toolchains/
命令下载:

wget https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/_toolchains/gcc-linaro-6.4.1-2017.11-x86_64_aarch64-linux-gnu.tar.xz

解压
xz -d gcc-linaro-6.4.1-2017.11-x86_64_aarch64-linux-gnu.tar.xz
安装:
mkdir -p /usr/local/tool
安装到指定目录
sudo tar -xvf gcc-linaro-6.4.1-2017.11-x86_64_aarch64-linux-gnu.tar -C /usr/local/tool/

2、添加环境变量

到 ~/.bashrc 文件
PATH=$PATH:/home/txdy827/gcc_sve_aarch64/aarch64-linux-gnu/bin
再用
source ~/.bashrc
使生效
用:
aarch64-linux-gnu-gcc -v
查看版本号:
666

3 参考别人

1、参考1
2、参考2
3、参考3
4、参考4

二、重新安装

1、安装必备软件包:

交叉编译GCC用到的三个软件包:binutils,glibc以及gcc
https://mirrors.nju.edu.cn/gnu/binutils/ ::用的binutils-2.32.tar.xz
https://ftp.gnu.org/gnu/glibc/ ::下载的这个glibc-2.30.tar.xz
https://github.com/gcc-mirror/gcc这个里边的有一个其他分支,选tag,然后下载这个:
https://github.com/gcc-mirror/gcc/tree/releases/gcc-9.2.0

1、1安装必备软件包:

sudo apt update
sudo apt upgrade
sudo apt install build-essential gawk git texinfo bison flex

2、新建路径:

mkdir -p /home/txdy827/sur/GNU/mk_cross_compiler/
cd /home/txdy827/sur/GNU/mk_cross_compiler

在mk_cross_compiler目录下新建code目录,把刚才那3个包解压缩到code路径下,
然后.tar.xz文件的处理方式是:两步解压:
第一步:xz -d file.tar.xz 先解压成.tar文件,
第二部 tar -xvf file.tar 就会生成相关的解压之后的目录了
还可以在解压时候指定解压到哪一个路径:如( tar -xvf file.tar -C /usr/local/)

解压之后会在/home/txdy827/src/GNU/mk_cross_compiler/code/目录下生成这3个包的相关目录。

3、在3个解压之后的目录中再分别新建一个用来./configure配置 和make编译这3个库的的文件夹

因为编译这3个库的时候,如果直接在解压之后的文件夹下直接./configure配置,make编译,在后边会出现错误,原因是不能在该文件夹下直接./configure配置

cd /home/txdy827/src/GNU/mk_cross_compiler/code/gcc-9.2.0
mkdir gcc-build

cd /home/txdy827/src/GNU/mk_cross_compiler/code/binutils-2.32
mkdir binutils-build

cd /home/txdy827/src/GNU/mk_cross_compiler/code/glibc-2.30
mkdir glibc-build

#(创建存放交叉编译可执行程序的路径,并加入PATH中)
创建一个用来指定编译成功的目标的文件夹:
cd  /home/txdy827/src/GNU/mk_cross_compiler
mkdir cross-gcc
在~/.bashrc文件中添加
PATH=$PATH:/home/txdy827/src/GNU/mk_cross_compiler/cross-gcc/bin
再source ~/.bashrc 使生效

4、在gcc源码包下载依赖的软件包

cd code/gcc-9_2_0/
./contrib/download_prerequisites

6、安装内核头文件,这样将来就可以用自己的交叉编译工具编译调用对应kernel的系统调用的应用程序

因为自己的内核文件不好用(在/usr/src/目录下,有好几个内核文件),就又网上下载了内核源文件:linux-5.4.55.tar.xz,然后解压进去解压之后的目录,在此处操作:

make ARCH=arm64 INSTALL_HDR_PATH=/home/txdy827/usr/GNU/mk_cross_compiler/cross-gcc/aarch64-linux-gnu headers_install

这一步骤会在cross-gcc目录下生成aarch64-linux-gnu目录,此目录下会有include目录,里边是一些头文件

7、编译安装binutils

cd到刚才第3步创建的目录中(此目录就是为了配置,编译用的,代码和编译要在不同的文件夹下,规定的,不然就是不行0:

cd /home/txdy827/src/GNU/mk_cross_compiler/code/binutils-2.32/binutils-build

../configure --prefix=/home/txdy827/src/GNU/mk_cross_compiler/cross-gcc --target=aarch64-linux-gnu --disable-multilib --with-arch=armv8

make -j8 //8个核一起编译
make install

此步骤执行之后:
会在cross-gcc 目录下生成 bin、share文件夹

下面开始编译glibc和gcc,由于这两个相互依赖,所以我们先部分编译gcc,然后部分编译glibc,最后全部编译gcc和glibc。

8、部分编译gcc

cd /home/txdy827/src/GNU/mk_cross_compiler/code/gcc-9.2.0/gcc-build

../configure --prefix=/home/txdy827/usr/GNU/mk_cross_compiler/cross-gcc --target=aarch64-linux-gnu --enable-languages=c,c++ --disable-multilib
make all-gcc -j8
make install-gcc

9、部分编译glibc

cd /home/txdy827/src/GNU/mk_cross_compiler/code/glibc-2.30/glibc-build

../configure --prefix=/home/txdy827/src/GNU/mk_cross_compiler/cross-gcc/aarch64-linux-gnu --build=$MACHINE --host=aarch64-linux-gnu --target=aarch64-linux-gnu --with-headers=/home/txdy827/src/GNU/mk_cross_compiler/cross-gcc/aarch64-linux-gnu/include --disable-multilib libc_cv_forced_unwind=yes

make install-bootstrap-headers=yes install-headers

make -j8 csu/subdir_lib

install csu/crt1.o csu/crti.o csu/crtn.o  /home/txdy827/src/GNU/mk_cross_compiler/cross-gcc/aarch64-linux-gnu/lib  //在库生成有.o文件

aarch64-linux-gnu-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o /home/txdy827/src/GNU/mk_cross_compiler/cross-gcc/aarch64-linux-gnu/lib/libc.so  //编译生成动态库

touch /home/txdy827/src/GNU/mk_cross_compiler/cross-gcc/aarch64-linux-gnu/include/gnu/stubs.h

10、修改GCC 9.2的源码,否则编译会报错

修改/home/txdy827/src/GNU/mk_cross_compiler/code/gcc-9_2_0/libsanitizer/asan/asan_linux.cc,在第77行加入如下代码:

#ifndef PATH_MAX
#define PATH_MAX 4096
#endif

11、接着部分编译gcc

回到刚才那个gcc-build文件夹下执行

make -j8 all-target-libgcc
make install-target-libgcc

12、全编译glibc

回到刚才的glibc-build文件夹下执行

make -j8
make install

13、全编译gcc

回到刚才那个gcc-build文件夹下执行

make -j8 all-target-libgcc
make install-target-libgcc

14、测试

$ aarch64-linux-gnu-gcc -v
使用内建 specs。
COLLECT_GCC=aarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/home/txdy827/src/GNU/mk_cross_compiler/cross-gcc/libexec/gcc/aarch64-linux-gnu/9.2.0/lto-wrapper
目标:aarch64-linux-gnu
配置为:../configure --prefix=/home/txdy827/src/GNU/mk_cross_compiler/cross-gcc --target=aarch64-linux-gnu --enable-languages=c,c++ --disable-multilib
线程模型:posix
gcc 版本 9.2.0 (GCC) 
txdy827@ubuntu:~/src/GN

编写一个hello.c文件:

#include <stdio.h>

int main(int argc, const char *argv[])
{
        printf("Hello World\n");
        return 0;
}

编译:

$ aarch64-linux-gnu-gcc --static hello_world.c -o hello_world

执行:
需要先下载一个执行的模拟平台:

sudo apt install qemu-user

再执行:
$ qemu-aarch64 ./hello_world
就对了

 类似资料: