openwrt - 如何从头开始获得更小的工具链?

标签 openwrt toolchain musl

我使用 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}  

构建 native 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   

构建跨 musl

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  

感谢您提前提出的所有评论!

最佳答案

修复此问题比预期的要简单...所有工具链二进制文件均未剥离安装。所以这个问题可以通过调用来修复

$ make install-strip

而不是

$ make install

当您安装 cross-gcc 时(第 2 阶段)。

生成的工具链大小为 122MB,与原始工具链的 557M 相比已经很不错了。所以这个问题已经解决了!希望这些信息将来对其他人有用。谢谢!

关于openwrt - 如何从头开始获得更小的工具链?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42022659/

相关文章:

openwrt buildroot build_dir 和 staging_dir

linux - arm-linux-gnueabi 工具链与 arm-linux-androideabi 工具链。

linux - 如何修改Buildroot包的来源进行包开发?

c - 如何在gdb中查看musl的源代码

c - OpenWrt 的 Eclipse GCC C 交叉编译不工作

linux - Curl 返回 ststus 6(DNS 名称错误地址错误)

makefile - 如何使创建的包在 make menuconfig 上可用?

c++ - C++ 工具链和编译器之间有什么区别?

c++ - 针对 musl 编译 libstdc++