交叉编译工具链制作



交叉编译工具链制作

基本概念

交叉编译就是在一个平台上生成另一个平台上的可执行二进制。这两个平台可以是不同的体系结构和不同的操作系统。例如,在嵌入式系统C/C++开发过程中,常常需要在x86/x86_64主机上编译出可执行程序,给armpowerpc体系结构的设备运行。

 

交叉编译的两个概念:

宿主机(host):编译程序的平台,一般是基于x86PC机,通常也称为主机。

目标机(target):用户开发软件所运行的设备,通常都是非x86平台。host编译生成的可执行程序target上运行。

 

交叉编译工具链是一个由编译器、链接器和解释器组成的综合开发环境,主要由binutilsgccglibc三个部分组成,安装在宿主机host上。其中,binutils主要生成一些辅助工具;gcc是用来生成交叉编译器,而glibc主要提供用户程序所依赖的一些基本函数库。

 

安装步骤

1、准备工作

1.1建立工作目录

构建交叉编译工具时,建议使用非root用户,防止出现覆盖问题。可以通过useradd -d命令先添加普通用户如hlz,然后执行:

cd $HOME

扫描二维码关注公众号,回复: 2621277 查看本文章

mkdir ppc

cd ppc

mkdir tools sources

cd sources

 

1.2下载开源软件

下载开源软件到$HOME/ppc/sources目录下,需要下载的开源软件列表:

binutils-2.19.tar.bz2  # 下载网站:ftp://ftp.gnu.org

glibc-2.9.tar.bz2      # 下载网站:ftp://ftp.gnu.org

glibc-linuxthreads-2.5.tar.bz2  # 下载网站:ftp://ftp.gnu.org

gcc-4.4.2.tar.bz2      # 下载网站:ftp://ftp.gnu.orghttp://mirrors.kernel.org/gnu/gcc

linux-2.6.31.tar.bz2   # Kernel Headers,下载网站:ftp://ftp.gnu.org

gmp-4.3.1.tar.bz2      # gcc依赖库,下载网站:ftp://ftp.gmplib.org/pub

mpfr-2.4.1.tar.bz2     # gcc依赖库,下载网站:http://www.mpfr.org/mpfr-current

 

1.3设置环境变量

export TARGET=powerpc-linux

export TOOLS=~/ppc/tools

export SOURCES=~/ppc/sources

export LC_ALL=C

 

2、安装 Kernel Headers

cd $SOURCES

tar -jxvf linux-2.6.31.tar.bz2

cd linux-2.6.31

 

#把内核头文件安装到$TOOLS/$TARGET/usr/include中。

make ARCH=powerpc INSTALL_HDR_PATH=$TOOLS/$TARGET/usr header_install

 

ls -p $TOOLS/$TARGET/usr/include   # 检查安装结果

asm/ asm-generic/ drm/ linux/ mtd/ rdmal/scsi/ sound/ video/ xem/

 

3、安装Binutils

安装Binutils工具,该Binutils用于目标平台。

cd $SOURCES

tar -jxvf binutils-2.19.tar.bz2

mkdir binutils-build

cd binutils-build

../binutils-2.19/configure --prefix=$TOOLS --target=$TARGET

make

make install

 

ls -p $TOOLS       # 检查安装结果

bin/ info/ lib/ man/ powerpc-linux/ share/

 

4gcc第一次安装

在第一次安装gcc之前,先安装两个依赖库gmpmpfr

tar -jxvf gmp-4.3.1.tar.bz2

cd gmp-4.3.1

./configure --enable-cxx --enable-mpbsd--prefix=/usr   # 默认为/usr/local

make

make check

sudo make install

 

tar -jxvf mpfr-2.4.1.tar.bz2

./configure --enable-thread-safe --prefix=/usr

make

make check

sudo make install

 

如安装正常,则进行gcc第一次安装:

tar -jxvf gcc-4.4.2.tar.bz2

mkdir gcc-bootstrap-build

cd gcc-bootstrap-build

../gcc-4.4.2/configure --target=$TARGET --prefix=$TOOLS --disable-nls --disable-shared --disable-mutilib --disable-decimal-float --disable-threads --disable-libmudflap --disable-libssp --disable-libgomp --without-headers --enable-language=c --with-newlib

make all-gcc

make install-gcc   #把编译好的gcc安装到$TOOLS/bin/$TARGET/bin

 

#编译安装gcc

make all-target-libgcc

#gcc库文件及头文件安装到$TOOLS/lib/$TARGET/$GCC_VERSION/目录下。

make install-target-libgcc

 

5、编译glibc

使用上面新安装的gcc编译,该glibc用于目标平台。

cd $SOURCES

tar -jxvf glibc-2.9.tar.bz2

tar -jxvf glibc-linuxthreads-2.5.tar.bz2 --directory=glibc-2.9

编译前修改glibc-2.9Makeconfig:

修改:gnulib := -lgcc $(libgcc_eh)

     static-gnulib := -lgcc -lgcc_eh $(libunwind)

为: gnulib := -lgcc

     static-gnulib := -lgcc

 

mkdir glibc_build

cd glibc_build

CC=$TOOLS/bin/${TARGET}-gcc ../glibc-2.9/configure --host=$TARGET --build=$(../glibc-2.9/scripts/config.guess) --with-headers=$TOOLS/$TARGET/usr/include --with-binutils=$TOOLS/$TARGET/powerpc-linux/bin --disable-profile --enable-add-ons libv_cv_forced_unwind=yes libc_cv_c_cleanup=yes --includedir=/usr/include --prefix=/usr/ --enable-add-ons=linuxthreads --enable-add-ons=nptl

make

make install_root=$TOOLS/$TARGET/prefix="" install

 

vi $TOOLS/$TARGET/lib/libc.so

修改: GROUP( /lib/libc.so.6/lib/libc_nonshared.a)

为:  GROUP( libc.so.6 libc_nonshared.a)

 

6gcc第二次安装

目标平台的glibc库已完备,接下来编译一个完整的gcc交叉工具链。

cd $SOURCES

mkdir gcc-full-build

cd gcc-full-build

../gcc-4.4.2/configure --target=$TARGET --host=$(../gcc-4.4.2/config.guess) --prefix=$TOOLS --with-headers=$TOOLS/$TARGET/usr/include --enable-language=C,C++ --disable-libgomp

make all

make install

 

7、总结

首次构建交叉编译工具链过程中,难免因系统环境、开源软件版本等差异出现各种各样的问题,具体问题需要各位耐心地具体分析,多搜索多查阅。只有尽可能多地发现并解决问题,才能不断的领悟,并在后续制作交叉编译工具链的过程中少走弯路。

 

 

猜你喜欢

转载自blog.csdn.net/hanlizhong85/article/details/78077518