工具链下载: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/
到 ~/.bashrc 文件
PATH=$PATH:/home/txdy827/gcc_sve_aarch64/aarch64-linux-gnu/bin
再用
source ~/.bashrc
使生效
用:
aarch64-linux-gnu-gcc -v
查看版本号:
666
交叉编译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
sudo apt update
sudo apt upgrade
sudo apt install build-essential gawk git texinfo bison flex
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个库的时候,如果直接在解压之后的文件夹下直接./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 使生效
cd code/gcc-9_2_0/
./contrib/download_prerequisites
因为自己的内核文件不好用(在/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目录,里边是一些头文件
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。
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
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
修改/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
回到刚才那个gcc-build文件夹下执行
make -j8 all-target-libgcc
make install-target-libgcc
回到刚才的glibc-build文件夹下执行
make -j8
make install
回到刚才那个gcc-build文件夹下执行
make -j8 all-target-libgcc
make install-target-libgcc
$ 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
就对了