交叉编译就是在一个平台上生成另一个平台上的可执行二进制。这两个平台可以是不同的体系结构和不同的操作系统。例如,在嵌入式系统C/C++开发过程中,常常需要在x86/x86_64主机上编译出可执行程序,给arm或powerpc体系结构的设备运行。
交叉编译的两个概念:
宿主机(host):编译程序的平台,一般是基于x86的PC机,通常也称为主机。
目标机(target):用户开发软件所运行的设备,通常都是非x86平台。host编译生成的可执行程序在target上运行。
交叉编译工具链是一个由编译器、链接器和解释器组成的综合开发环境,主要由binutils、gcc和glibc三个部分组成,安装在宿主机host上。其中,binutils主要生成一些辅助工具;gcc是用来生成交叉编译器,而glibc主要提供用户程序所依赖的一些基本函数库。
1.1建立工作目录
构建交叉编译工具时,建议使用非root用户,防止出现覆盖问题。可以通过useradd -d命令先添加普通用户如hlz,然后执行:
cd $HOME
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.org,http://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
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/
安装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/
在第一次安装gcc之前,先安装两个依赖库gmp和mpfr:
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
使用上面新安装的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.9的Makeconfig:
修改: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)
目标平台的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
首次构建交叉编译工具链过程中,难免因系统环境、开源软件版本等差异出现各种各样的问题,具体问题需要各位耐心地具体分析,多搜索多查阅。只有尽可能多地发现并解决问题,才能不断的领悟,并在后续制作交叉编译工具链的过程中少走弯路。