如何从头开始获得更小的工具链?
Posted
技术标签:
【中文标题】如何从头开始获得更小的工具链?【英文标题】:How to get a smaller toolchain from scratch? 【发布时间】:2017-06-20 17:32:49 【问题描述】:我使用 gcc-6.3.0、musl-1.1.16 和 binutils-2.27 从头开始为 MIPS 24kc (dragino) 目标平台构建了一个自定义工具链。该工具链功能齐全。
但是,我的自定义工具链的大小是等效 OpenWRT 生成的工具链大小的五倍(557M 与 113M)。 OpenWRT (mips-openwrt-linux-musl-*) 生成的工具链二进制文件与 libstdc++ 和 libgcc_s 库动态链接。但是,我的工具链二进制文件与这些库静态链接:
$ ldd mips-openwrt-linux-musl-gcc-5.3.0
linux-vdso.so.1 => (0x00007ffc4d534000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f878936f000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f8789159000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8788d8f000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8788a86000)
/lib64/ld-linux-x86-64.so.2 (0x000055df3ef8b000)
$ ldd mips-linux-musl-gcc-6.3.0
linux-vdso.so.1 => (0x00007ffd40940000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f2de4b8f000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2de47c6000)
/lib64/ld-linux-x86-64.so.2 (0x0000560bba4b6000)
cc1 和 cc1plus 也会出现同样的链接问题。这两个二进制文件的大小很大(cc1 为 124MB,cc1plus 为 134MB)。
我的问题是:设置跨工具链生成以获得与 OpenWRT 生成的工具链一样小的跨平台工具链的正确方法是什么?
您可以在下面找到我正在执行的构建自定义工具链的步骤以供参考:
下载来源:
wget http://ftpmirror.gnu.org/binutils/binutils-2.27.tar.bz2
wget http://ftpmirror.gnu.org/gcc/gcc-6.3.0/gcc-6.3.0.tar.bz2
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.12.6.tar.bz2
wget https://www.musl-libc.org/releases/musl-1.1.16.tar.gz
wget http://ftpmirror.gnu.org/mpfr/mpfr-3.1.5.tar.bz2
wget http://ftpmirror.gnu.org/gmp/gmp-6.1.2.tar.bz2
wget http://ftpmirror.gnu.org/mpc/mpc-1.0.2.tar.gz
设置编译环境:
export ROOTDIR="$HOME/custom-toolchains/MIPS"
export NATIVE_PREFIX="$ROOTDIR/opt/native"
export CROSS_PREFIX="$ROOTDIR/opt/cross"
export TARGET_MACHINE=mips
export CPU=mips
export ARCH=24kc
export CLIB=musl
export TARGET_TRIPLET=$CPU-linux-$CLIB
构建原生 binutils:
cd $ROOTDIR/src
mkdir build-binutils
cd build-binutils
../binutils-2.27/configure --prefix="$NATIVE_PREFIX" --disable-nls --disable-werror --disable-multilib
make
make install
构建原生 gcc:
cd $ROOTDIR/src/gcc-6.3.0
ln -s ../mpfr-3.1.5 mpfr
ln -s ../gmp-6.1.2 gmp
ln -s ../mpc-1.0.3 mpc
cd ..
mkdir build-gcc
cd build-gcc
../gcc-6.3.0/configure --prefix=$NATIVE_PREFIX --disable-nls --enable-languages=c --disable-multilib
make
make install
构建跨binutils:
cd $ROOTDIR/src
mkdir build-$CPU-binutils
cd build-$CPU-binutils
../binutils-2.27/configure --target=$TARGET_TRIPLET --prefix=$CROSS_PREFIX --with-sysroot --disable-nls --disable-werror --disable-multilib
make
make install
安装内核头文件:
cd $ROOTDIR/src
cd linux-3.12.6
make ARCH=$TARGET_MACHINE INSTALL_HDR_PATH=$CROSS_PREFIX/$TARGET_TRIPLET headers_install
构建跨 gcc(阶段 1)
cd $ROOTDIR/src
mkdir build-bootstrap-$CPU-gcc
cd build-bootstrap-$CPU-gcc
../gcc-6.3.0/configure --target=$TARGET_TRIPLET --prefix=$CROSS_PREFIX --disable-nls --enable-languages=c --disable-multilib --disable-threads --disable-shared --with-float=soft --with-arch=$ARCH
make all-gcc install-gcc
make all-target-libgcc install-target-libgcc
构建跨文化
cd $ROOTDIR/src
mkdir build-$CLIB
cd build-$CLIB
CC=$TARGET_TRIPLET-gcc CFLAGS=-Wa,-msoft-float ../musl-1.1.16/configure --prefix=$CROSS_PREFIX/$TARGET_TRIPLET/ --enable-optimize CROSS_COMPILE=$TARGET_TRIPLET-
make
make install
构建跨 gcc(第 2 阶段)
cd $ROOTDIR/src
mkdir build-$CPU-gcc
cd build-$CPU-gcc
../gcc-6.3.0/configure --target=$TARGET_TRIPLET --prefix=$CROSS_PREFIX --disable-nls --enable-languages=c,c++ --disable-multilib --enable-threads --enable-shared --with-float=soft --with-arch=$ARCH --enable-target-optspace --disable-libgomp --disable-libmudflap --without-isl --without-cloog --disable-decimal-float --disable-libssp --disable-libsanitizer --enable-lto --with-host-libstdcxx=-lstdc++
make
make install
提前感谢您的所有 cmets!
【问题讨论】:
【参考方案1】:解决此问题比预期的要简单...所有工具链二进制文件均未剥离安装。所以这可以固定调用
$ make install-strip
而不是
$ make install
当您安装跨 gcc 时(第 2 阶段)。
生成的工具链大小为 122MB,与原始工具链的 557M 相比,还算不错。所以这个问题是固定的!希望这些信息将来对其他人有用。谢谢!
【讨论】:
以上是关于如何从头开始获得更小的工具链?的主要内容,如果未能解决你的问题,请参考以下文章