制作在x86主机下运行的arm交叉编译工具链

我是在x86_64环境下制作arm的编译工具链,不过我一直没有找到一份好的参考资料来说明每一步的所代表的具体的意义;

以及每一参数对工具链的影响.如果有好的参考资料的小伙伴欢迎参与讨论和私信.

另外,制作出来的工具链并没有运用的实际工作中(编译出来的程序可以在arm架构的cpu上跑),仅仅是好奇做出来的.

!!!!!!!!!!!!!!!!!!!!!!!!!没有充足的把握还是不要用到项目中.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


环境准备

  • ubuntu18.04(LTS)

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

正式流程

  • 安装基于arm的linux头文件
提前把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
  • 编译binutils
把剩下的源码全部复制到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
  • 从glibc创建头文件
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
  • 编译glibc
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
 

 

 

你可能感兴趣的:(Linux)