我是在x86_64环境下制作arm的编译工具链,不过我一直没有找到一份好的参考资料来说明每一步的所代表的具体的意义;
以及每一参数对工具链的影响.如果有好的参考资料的小伙伴欢迎参与讨论和私信.
另外,制作出来的工具链并没有运用的实际工作中(编译出来的程序可以在arm架构的cpu上跑),仅仅是好奇做出来的.
!!!!!!!!!!!!!!!!!!!!!!!!!没有充足的把握还是不要用到项目中.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ubuntu安装完成以后,需要安装一下几个工具:
flex,bison,texinfo,gawk, build-essential, g++
binutils-2.30.tar
gcc-7.2.0.tar
glibc-2.26.tar
linux-4.19.30.tar
下面的是数学库和浮点运算库
gmp-6.1.2.tar
mpc-1.0.3.tar
mpfr-3.1.6.tar
这些工具库不同版本的组合有些是会编译失败的,以上的版本是我实验过可以成功编译出来的.
创建编译目录
mkdir -p ./arm-linux/{kernel/,tools/sysroot,build-tools/{build-gcc,build-boot-gcc,build-glibc,build-binutils,glibc-header}}
创建环境变量文件(env.sh)
#!/bin/bash
export PRJROOT=~/arm-linux
export BUILD=x86_64-pc-linux-gnu
export TARGET=arm-none-linux-gnueabi
export PREFIX=${PRJROOT}/tools
export TARGET_PREFIX=${PREFIX}/${TARGET}
export SYSROOTDIR=${PREFIX}/sysroot
export PATH=${PREFIX}/bin:${PATH}
source env.sh
提前把linux复制到kernel目录下
cd $PRJROOT/kernel
tar -xzvf linux-4.19.30.tar.gz
cd linux-4.19.30
mkdir ${SYSROOTDIR}/usr
make mrproper
make ARCH=arm headers_check
make ARCH=arm INSTALL_HDR_PATH=${SYSROOTDIR}/usr headers_install
把剩下的源码全部复制到build-tools/目录下
cd $PRJROOT/build-tools/
tar -xzvf binutils-2.30.tar.gz
cd build-binutils
../binutils-2.30/configure --build=$BUILD --target=$TARGET --prefix=$PREFIX --with-sysroot=${SYSROOTDIR}
make
sudo make install
cd $PRJROOT/build-tools/
tar -xzvf gcc-7.2.0.tar.gz
tar -xjvf gmp-6.1.2.tar.bz2
tar -xzvf mpc-1.0.3.tar.gz
tar -xzvf mpfr-3.1.6.tar.gz
mv gmp-6.1.2 ./gcc-7.2.0/gmp
mv mpc-1.0.3 ./gcc-7.2.0/mpc
mv mpfr-3.1.6 ./gcc-7.2.0/mpfr
cd build-boot-gcc
../gcc-7.2.0/configure --build=$BUILD --host=$BUILD --target=$TARGET --prefix=$PREFIX \
--disable-shared --without-headers --with-newlib --enable-languages=c \
--disable-libgomp --disable-libmudflap --disable-libssp \
--disable-threads --disable-multilib --disable-nls \
--enable-bootstrap --enable-__cxa_atexit --with-gnu-ld --with-gnu-as
make all-gcc
sudo make install-gcc
make all-target-libgcc
sudo make install-target-libgcc
cd $PRJROOT/build-tools/
tar -xzvf glibc-2.26.tar.gz
cd glibc-header
../glibc-2.26/configure --build=$BUILD --host=$TARGET --prefix=$SYSROOTDIR/usr \
--with-headers=$SYSROOTDIR/usr/include libc_cv_forced_unwind=yes \
libc_cv_c_cleanup=yes --enable-add-ons --enable-kernel
make -k install-headers cross_compiling=yes install_root=$SYSROOTDIR
cd $PRJROOT/build-tools/
cd build-glibc
CC=arm-none-linux-gnueabi-gcc ../glibc-2.26/configure --build=$BUILD --host=$TARGET --prefix="/usr" \
--with-headers=$SYSROOTDIR/usr/include libc_cv_forced_unwind=yes \
libc_cv_c_cleanup=yes
make -k install-headers cross_compiling=yes install_root=$SYSROOTDIR
make
sudo make install_root=$SYSROOTDIR install
cd $PRJROOT/build-tools/
cd build-gcc
../gcc-7.2.0/configure --build=$BUILD --target=$TARGET --prefix=$PREFIX \
--with-sysroot=$SYSROOTDIR \
--enable-languages=c --with-gnu-ld --with-gnu-as --disable-multilib \
--with-float=soft --disable-sjlj-exceptions \
--disable-nls --enable-threads=posix \
--disable-libmudflap --disable-libssp \
--enable-long-longx --with-shared \
libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes
make
sudo make install
自此,基于arm的交叉编译工具链已经完成了.最终的效果
其中较为关键的是--with-sysroot参数的使用.
当然你也可以使用crosstool-ng来建立交叉编译工具链
参考链接:
如何为嵌入式开发建立交叉编译环境
To build a cross toolchain to ARM architecture
如何构建MIPS交叉编译工具链
编译制作完成的工具
链接:https://pan.baidu.com/s/1AP5c-8MMGCcK-q3QITn_hQ
提取码:safo