gcc 9.2 交叉工具链构建过程

1. 环境准备

1.1 host环境

ubuntu 16.04 64bit + gcc 5.4.0

1.2 target环境

aarch64 + linux + glibc

1.3 源码

binutils源码
url=git://sourceware.org/git/binutils-gdb.git
version=da3b036b57c0d409fc1fc3e25597fa13dc71baf5

gcc源码(9.2)

直接从arm官网下载,目前的源码版本是9.2
https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads

linux kernel源码
url=git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
version=v4.20.13

glibc源码
url=git://sourceware.org/git/glibc.git
version=50f20fe506abb8853641006a7b90a81af21d7b91

一些依赖包根据需要安装,缺少的具体包在configure时会提示。

gcc源码依赖下面几个包,从arm官网下载的源码包里包含了这些依赖包的源码,在gcc源码目录里创建符号链接即可

cd gcc
ln -s ../mpfr-x.x.x mpfr
ln -s ../gmp-x.x.x gmp
ln -s ../mpc-x.x.x mpc
ln -s ../isl-x.x.x isl

x.x.x是版本号,若自己单独下载这些依赖包,不同的版本号可能会带来一些兼容性问题,所以直接下载arm的gcc源码好处是这些依赖包已经打包好,且经过编译验证没有问题的。

2. 构建步骤

设置环境变量

export TARGET=aarch64-xxx-linux-gnu
export PREFIX=/home/summit/projects/cross-toolchain/install
export SYSROOT=$PREFIX/$TARGET/libc
export PATH=$PREFIX/bin:$PATH

其中,xxx表示vendor,SYSROOT就是用于存放内核头文件和glibc头文件等。

2.1 构建binutils

Binutils源码主要用于构建交叉汇编器、链接器和其他工具,具体包括如下:

 构建

mkdir build-binutils
cd build-binutils
../binutils-gdb/configure --prefix=$PREFIX --with-sysroot=$SYSROOT --with-build-sysroot=$SYSROOT --target=$TARGET
make -j4
make install

2.2 安装内核头文件

在内核源码目录执行
make ARCH=arm64 INSTALL_HDR_PATH=$SYSROOT/usr headers_install

安装后的文件内容如下图所示

 2.3 第一次构建gcc

mkdir build-gcc-s1
cd build-gcc-s1

../gcc-arm-src-snapshot-9.2-2019.12/configure --prefix=$PREFIX --with-sysroot=$SYSROOT --with-build-sysroot=$SYSROOT --target=$TARGET --disable-libssp --disable-libquadmath --disable-threads --without-headers --with-newlib --disable-libmudflap --disable-bootstrap --disable-decimal-float --disable-libgomp --disable-libatomic --disable-libsanitizer --disable-plugins --disable-libitm --disable-libstdcxx --disable-libvtv --enable-languages=c,c++ --disable-shared

make -j4 all-gcc
make -j4 all-target-libgcc
make install-gcc
make install-target-libgcc

以前构建gcc第一阶段的时候,只需构建c语言即可,配置选项设置:
--enable-languages=c
从最近版本的glibc开始,一些组件需要c++构建,
因此在第一阶段需要使用下面的配置选项:
--disable-libstdcxx --disable-libvtv --enable-languages=c,c++

2.4 构建glibc

mkdir -p build-glibc
cd build-glibc

../glibc/configure --prefix=/usr --build=$MACHTYPE --host=$TARGET --target=$TARGET --with-headers=$SYSROOT/usr/include --without-gd --enable-obsolete-rpc --disable-profile libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes --without-selinux --disable-werror

make -j4
make install_root=$SYSROOT install

注意,prefix参数的含义与一般的prefix的参数的含义不太一样。若按照构建gcc或binutils那样去设置该参数,会出现下面链接里的错误。

[1] https://gcc-help.gcc.gnu.narkive.com/zbYyAAYO/gcc-binutils-libc-cross-compiling-path-to-libc-so-6-malformed-in-ld

实际上,glibc考虑到了native和cross的构建场景,统一按照native的使用场景设置prefix即可。这样生成的glibc.so等库文件将$SYSROOT和prefix指定的路径拼接时不会出错。

2.5 第二次构建gcc

mkdir build-gcc-s2
cd build-gcc-s2

../gcc-arm-src-snapshot-9.2-2019.12/configure --prefix=$PREFIX --with-sysroot=$SYSROOT --with-build-sysroot=$SYSROOT --target=$TARGET --enable-languages=c,c++ --with-bugurl=https://bugs.linaro.org/ --enable-gnu-indirect-function --enable-shared --disable-libssp --disable-libmudflap --enable-checking=release --enable-fix-cortex-a53-843419 --with-pkgversion='GNU Toolchain for the A-profile Architecture 9.2-2019.12 (arm-9.10)'

make j4
make install

3. 结束

至此,交叉编译工具链构建完毕。目前虽然有很多自动化工具用于构建交叉交叉工具链,例如linaro abe,buildroot等,但手动构建可以对工具链以及c库的生成过程理解更深刻。

posted @ 2020-03-16 14:21  summitzhou  阅读(1518)  评论(0编辑  收藏  举报