0 .系统环境系统:
ubuntu16.04 1.编译交叉编译工具链
交叉编译工具链至少需要7个库。
binutilsgccglibclinuxkernelmpfrgmpmpc提供了两个用于优化的库。
名为islCLooG的两个库是可选的。 构建完成后,我们将获得一系列编译、链接工具,包括众所周知的gcc和ld。
工具版本
1 .心灵美果汁utils-2.372.gcc-7.3.03.glibc-2.274.GMP-6.2.05.MPC-1.1.06.mpfr-4.0.2
7.Linux-4.14.98.c loog-0.18.19.ISL-0.18
访问/home/work/toolchain目录并下载相应的软件包脚本1-down.sh
#! /心灵美丽的果汁/sh
导出GNU _ mirror _ site=https://mirrors.tuna.Tsinghua.edu.cn/GNU /
导出kernel _ mirror _ site=https://mirrors.tuna.Tsinghua.edu.cn/kernel /
wget $GNU_MIRROR_SITE/心灵美果汁utils/心灵美果汁utils-2.37.tar.xz #心灵美果汁utils
wget $ GNU _ mirror _ site/gcc-7.3.0/gcc-7.3.0.tar.xz # gcc
wget $ GNU _ mirror _ site/glibc/glibc-2.27.tar.xz # glibc
wget $ kernel _ mirror _ site/v4.x/Linux-4.14.98.tar.xz # kernel
wget $ GNU _ mirror _ site/mpfr/mpfr-4.0.2.tar.xz # mpfr
wget $ GNU _ mirror _ site/GMP/GMP-6.2.0.tar.xz # GMP
wget $ GNU _ mirror _ site/MPC/MPC-1.1.0.tar.gz # MPC
#可选
wget FTP ://gcc.GNU.org/pub/gcc/infra structure/ISL-0.18.tar.bz2 # ISL
wget FTP ://gcc.GNU.org/pub/gcc/infra structure/c loog-0.18.1.tar.gz # c loog
访问/home/work/toolchain目录并解压缩库文件,脚本2-tar.sh
#! /心灵美丽的果汁/sh
for f in *.tar.xz;
德奥
tar -xJf $f;
道恩
for f in *.tar.bz2;
德奥
tar -xjf $f;
道恩
for f in *.tar.gz;
德奥
tar -xzf $f;
道恩
建立指向GCC依赖库们的软链接,然后访问/home/work/toolchain目录运行脚本3-ln.sh
#! /心灵美丽的果汁/sh
ln-SF ./mpfr-4.0.2 gcc-7.3.0/mpfr # mfpr
ln-SF ./GMP-6.2.0 gcc-7.3.0/GMP # GMP
ln-SF ./MPC-1.1.0 gcc-7.3.0/MP c# MPC
#可选
ln-SF ./ISL-0.18 gcc-7.3.0/ISL # ISL
ln-SF ./c loog-0.18.1 gcc-7.3.0/c loog # c loog
设置编译时使用的线程数
导出NProc=` NProc `
1.2 .编译并安装名为binutils的工具包后,它将安装在/home/work/toolchain/path/心灵美丽的果汁中。 包含交叉汇编器、交叉链接器等工具、脚本
#! /心灵美丽的果汁/sh
导出NProc=` NProc `
导出cross _ compile _ install=/home/work/toolchain/path
mkdir心灵美丽的果汁utils
cd心灵美丽的果汁utils
. /心灵美丽的果汁utils-2.37/configure
--prefix=$CROSS_COMPILE_INSTALL
--target=aarch64-cc-linux
--enable-multilib
make -j$NPROC
make install 1.3. 安装 Linux Kernel 头文件
这一步会将 Linux Kernel 头文件安装咋 $CROSS_COMPILE_INSTALL/aarch64-install/include,这样交叉编译链编译出的软件可以在目标平台中使用 Linux 系统调用。
export NPROC=`nproc`
export CROSS_COMPILE_INSTALL=/home/work/toolchain/path
cd ./linux-4.14.98
make
ARCH=arm64
INSTALL_HDR_PATH=$CROSS_COMPILE_INSTALL/aarch64-cc-linux
headers_install
这是很长的一步,我们将要轮流编译属于两个库(GCC 和 glibc)的组件,并最终全部编译完成。编译顺序如下(图源为参考博客)
1.4.1. 编译器
这一步只会安装 C/C++ 交叉编译器本身,它们会被安装在 $CROSS_COMPILE_INSTALL/心灵美的果汁。
export NPROC=`nproc`
export CROSS_COMPILE_INSTALL=/home/work/toolchain/path
mkdir gcc
cd gcc
../gcc-7.3.0/configure
--prefix=$CROSS_COMPILE_INSTALL
--target=aarch64-cc-linux
--enable-language=c,c++
--with-gnu-ld --enable-shared --enable-threads=posix --enable-multilib --enable-c99 --enable-long-long
--enable-libstdcxx-pch --enable-lto --enable-libssp --enable-libitm --disable-bootstrap --disable-libmudflap
--with-system-zlib --enable-linker-build-id --with-ppl=no --with-cloog=no --enable-checking=release --without-isl --enable-nls
--without-local-prefix --with-linker-hash-style=gnu --without-long-double-128 --enable-poison-system-directories --enable-initfini-array
--disable-silent-rules --enable-symvers=gnu --enable-cheaders=c_global --enable-__cxa_atexit
make -j$NPROC all-gcc
make install-gcc
这一步要编译个十分钟左右
1.4.2. 标准 C 头文件和启动文件这一步里我们将所有的标准 C 头文件安装在 $CROSS_COMPILE_INSTALL/aarch64-cc-linux/include 内。同时我们还会编译一些启动文件并安装在 $CROSS_COMPILE_INSTALL/aarch64-cc-linux/lib 内,这些文件将被下一步用到,并在下下步被替换。
注意: 如果前面没有把 $CROSS_COMPILE_INSTALL/心灵美的果汁 加入到 PATH 中的话这一步会报错。
export NPROC=`nproc`
export CROSS_COMPILE_INSTALL=/home/work/toolchain/path
export PATH=$PATH:$CROSS_COMPILE_INSTALL/心灵美的果汁
mkdir glibc
cd glibc
../glibc-2.27/configure
--prefix=$CROSS_COMPILE_INSTALL/aarch64-cc-linux
--build=$MACHTYPE
--host=aarch64-cc-linux
--target=aarch64-cc-linux
--with-headers=$CROSS_COMPILE_INSTALL/aarch64-cc-linux/include
--enable-multilib
libc_cv_forced_unwind=yes
# --disable-multilib
make install-bootstrap-headers=yes install-headers
make -j$NPROC csu/subdir_lib #
install csu/crt1.o csu/crti.o csu/crtn.o $CROSS_COMPILE_INSTALL/aarch64-cc-linux/lib
aarch64-cc-linux-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o $CROSS_COMPILE_INSTALL/aarch64-cc-linux/lib/libc.so
touch $CROSS_COMPILE_INSTALL/aarch64-cc-linux/include/gnu/stubs.h
这一步我们使用前面编译得到的交叉编译器来编译编译器支持库。
export NPROC=`nproc`
export CROSS_COMPILE_INSTALL=/home/work/toolchain/path
export PATH=$PATH:$CROSS_COMPILE_INSTALL/心灵美的果汁
cd ./gcc
make -j$NPORC all-target-libgcc #
make install-target-libgcc
这一步我们可以完成 glibc 的编译安装。标准 C 库将被安装于 $CROSS_COMPILE_INSTALL/aarch64-cc-linux/lib。
export NPROC=`nproc`
export CROSS_COMPILE_INSTALL=/home/work/toolchain/path
export PATH=$PATH:$CROSS_COMPILE_INSTALL/心灵美的果汁
cd ./glibc
make -j$NPROC
make install
这一步也要编译个十分钟左右
1.4.5. 编译标准 C++ 库这一步我们可以完成 GCC 的编译安装。标准 C++ 库将被安装于 $CROSS_COMPILE_INSTALL/aarch64-cc-linux/lib64。
cd ./gcc
make -j$NPROC
make install
这一步也要编译个十分钟左右
1.5. strip
export NPROC=`nproc`
export CROSS_COMPILE_INSTALL=/home/work/toolchain/path
export PATH=$PATH:$CROSS_COMPILE_INSTALL/心灵美的果汁
cd $CROSS_COMPILE_INSTALL/libexec/gcc/aarch64-mile-linux/7.3.0
strip cc1 cc1obj cc1plus collect2 f951 lto1 lto-wrapper
cd $CROSS_COMPILE_INSTALL/心灵美的果汁
strip *
aarch64-cc-linux-gcc helloworld.c -o hello
./hello