PowerPC交叉编译工具链的制作

本文主要讨论在X86平台上制作一个PowerPC的交叉编译工具链的方法和步骤。
标题
  1. 交叉编译工具链的基本概念
  2. 准备工作
  3. Install Kernel Headers
  4. Binutils
  5. GCC 第一遍
  6. Glibc
  7. gcc 第二遍
  8. 总结

交叉编译工具链的基本概念


什么是交叉编译工具链,这是许多初学者的首要问题。通常我们已经习惯在X86平台上运行gcc,对源程序进行编译,编译得到的目标程序,仍然是在X86平台上跑的。而交叉编译工具链就是,需要在某个平台上,对源程序进行编译,但是得到的目标程序却是在另外一个平台上运行的。

交叉编译工具链的制作包含哪些基本概念。我们已经知道,在某个平台对程序进行编译后,得到的目标程序,默认也是在该平台运行的(例如X86)。所以我们通常需要在现有平台(通常我们把这个平台称为Host)的基础上,制作出一个交叉编译工具链(包括gcc, binutils, glibc),得到新的gcc仍然是在该平台(通常我们把该平台称为Host)上运行的,但是当利用新的gcc去对某个源程序进行编译时,得到的目标程序是在目标平台上运行的(通常我们把该平台称为Target)。

因此,现在我们知道,制作交叉编译工具链少不了要先编译一个gcc和binutils(包括链接器ld, strip等工具),但是仅仅是这两个还不够的。我们知道,在对源程序进行编译时,少不了要依赖一些库,例如C运行时库(glibc),而你的Host中的库,它是针对Host体系结构的。例如你的X86中的库,其机器指令一定是X86的。这样,你的交叉编译工具链中,必须有目标平台的库。你肯定已经想到了,先编译好gcc和binutils,然后用这个gcc编译目标平台的库,然后就可以在这个库的基础上,编译目标平台的程序了。

现在你已经可以想到制作一个交叉编译工具链的步骤了,但是很快你会看到,在gcc的编译过程中,我们需要编译2遍,这是为什么呢? 一个全面的gcc(支持各种语言的),需要目标平台的C库(glibc)的一些头文件,但是这个新的gcc编译出来之前,我们又没有安装目标平台的库(glibc)。所以我们先编译一个基本的gcc(仅仅支持C语言),然后用这个gcc编译目标平台的glibc,注意此时得到的glibc是目标平台的。最后,再在这个库的基础上,重新编译一个全面的gcc。

除此之外,我们还要准备好内核头文件,这样我们就可以直接使用内核的一些宏,数据结构定义,数据类型,等等。

在有了这些概念的基础上,下面的操作就相对比较简单了。这里需要提醒的是,同样的编译参数,不同的编译环境,或者不同的gcc, binutils,glibc版本,都可能编译不成功。根据我的经验,制作交叉编译工具链,一帆风顺就成功是很少见的。因此在编译过程中,如果遇到失败,耐心+细心的分析config.log,Makefile,可以帮助你定位问题。尤其对于新手来说,千万不要急于求成,妄想直接复制一下命令行,一步步编译就成功。我建议只是先看完一遍,对自己要做什么,和每一步的目的有个大概的了解,然后再开始。欲速则不达,这个道理很简单,恐怕只有多品位几次才能体会。

另外,千万不要以超级用户(root)的身份来制作交叉编译工具链,否则一不小心用target平台的库,把Host平台上的库给覆盖了,后果可是很严重哦!

准备工作


cd $HOME
mkdir ppc
cd ppc
mkdir sources
cd sources

wget http://ftp.gnu.org/gnu/binutils/binutils-2.19.tar.bz2
wget http://ftp.gnu.org/gnu/glibc/glibc-2.9.tar.bz2
wget http://ftp.gnu.org/gnu/glibc/glibc-linuxthreads-2.5.tar.bz2
wget http://ftp.gnu.org/gnu/gcc/gcc-4.4.2/gcc-4.4.2.tar.bz2
wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.31.tar.bz2

wget ftp://ftp.gnu.org/gnu/gmp/gmp-4.3.1.tar.bz2
wget http://www.mpfr.org/mpfr-current/mpfr-2.4.1.tar.bz2

mkdir ../tools

export TARGET=powerpc-linux
export TOOLS=~/ppc/tools
export SOURCES=~/ppc/sources
export LANGUAGE=C
export LC_ALL=C

Install Kernel Headers


cd $SOURCES
tar jvxf linux-2.6.31.tar.bz2
make ARCH=powerpc INSTALL_HDR_PATH=$TOOLS/$TARGET/usr headers_install
把内核头文件安装到$TOOLS/$TARGET/usr/include中。
ls -p $TOOLS/$TARGET/usr/include
asm/ asm-generic/ drm/ linux/ mtd/ rdma/ scsi/ sound/ video/ xen/

Binutils


cd $SOURCES
tar jvxf binutils-2.19.tar.bz2
mkdir binutils-build
cd binutils-build
../binutils-2.19/configure --prefix=$TOOLS --target=$TARGET
make
make install

安装完成后,$TOOLS目录如下:
ls -p $TOOLS
bin/ info/ lib/ man/ powerpc-linux/ share/
此处需要注意的是:$TOOLS/bin/ 和 $TOOLS/$TARGET/bin(TARGET就是powerpc-linux)的内容
ls -p $TOOLS/bin
powerpc-linux-addr2line powerpc-linux-c++filt powerpc-linux-ld powerpc-linux-objdump powerpc-linux-size
powerpc-linux-ar powerpc-linux-embedspu powerpc-linux-nm powerpc-linux-ranlib powerpc-linux-strings
powerpc-linux-as powerpc-linux-gprof powerpc-linux-objcopy powerpc-linux-readelf powerpc-linux-strip

ls -p $TOOLS/$TARGET/bin
ar as ld nm objcopy objdump ranlib strip
这些文件虽然在不同的目录,有不同的名字,但其实是一个文件:
md5sum $TOOLS/bin/powerpc-linux-as
3f77cbaaa417e2f59059114457d7d074 bin/powerpc-linux-as
root@yunhual-desktop:/home/yunhual/dev/ppc/tool# md5sum powerpc-linux/bin/powerpc-linux-as
md5sum $TOOLS/$TARGET/bin/as
3f77cbaaa417e2f59059114457d7d074 powerpc-linux/bin/as

除此之外,binutils把用于生成目标平台的代码的链接脚本安装到$TOOLS/$TARGET/ldscripts目录下。

GCC 第一遍


由于编译gcc依赖 gmp,mpfr这两个库,因此在编译gcc之前,首先安装这两个库.
tar jvxf gmp-4.3.1.tar.bz2
cd gmp-4.3.1
./configure --enable-cxx --enable-mpbsd --prefix=/usr
make
make check
sudo make install

如果没有指定--prefix=/usr,那么gmp默认安装到/usr/local目录下,而mpfr默认到/usr目录下搜索这个库。
因此这里通过--prefix=/usr,把他们都安装到/usr下。见mpfr的FAQ: http://www.mpfr.org/faq.html

cd $SOURCES
tar jvxf mpfr-2.4.1.tar.bz2
./configure --enable-thread-safe --prefix=/usr
make
make check
sudo make install

现在第一次编译GCC:
cd $SOURCES
tar jvxf 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库
make all-target-libgcc
make install-target-libgcc

make install-gcc 把编译好的gcc分别安装到$TOOLS/bin/ 和 $TOOLS/$TARGET/bin
md5sum $TOOLS/bin/powerpc-linux-gcc
737e148f8fcf46d9c38636f01a1dd887 bin/powerpc-linux-gcc
md5sum $TOOLS/$TARGET/bin/gcc
737e148f8fcf46d9c38636f01a1dd887 powerpc-linux/bin/gcc

make install-target-libgcc
主要把gcc的库文件及头文件安装到$TOOLS/lib/$TARGET/$GCC_VERSION/目录中。
这里$GCC_VERSION表示gcc版本号。

Glibc


下面用这个新的gcc编译glibc,这个glibc是目标平台的。
cd $SOURCES
tar jvxf glibc-2.9.tar.bz2
tar jvxf glibc-linuxthreads-2.5.tar.bz2 --directory=glibc-2.9

编译之前,修改glibc-2.9的Makeconfig,否则会出错。
vim 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 libc_cv_forced_unwind=yes
libc_cv_c_cleanup=yes --disable-profile --includedir=/usr/include
--prefix=/usr/ --enable-add-ons=linuxthreads --enable-add-ons=nptl
make
make install_root=$TOOLS/$TARGET prefix="" install

首先,CC=...,binutils=... 指定了用我们新编译好的gcc和binutils,因此得到的glibc是目标平台的。

最后,打开$TOOLS/$TARGET/lib/libc.so
把 GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a ) 改为:
GROUP ( libc.so.6 libc_nonshared.a )

gcc 第二遍


现在,库已经准备好了,编译一个全面的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-languages=c,c++ --disable-libgomp
make all
make install

总结


现在,你就可以在X86平台上运行powerpc-linux-gcc,编译一个C程序,注意得到的目标程序是在PowerPC平台上执行的。最好建议任何一个感兴趣的新手,最好玩几次LFS。注意千万不要跟着文档,一步步敲入现成的指令,最后看到你的LFS跑起来,就认为大功告成了。第一次你可以这么做,然后,自己再想想这个过程中,没一步是要做什么,然后再总结一下,最后按照自己的总结和理解,重新做两次。LFS很费时,但是理解之后,你不需要把所有东西都编译出来。重要的时理解它。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值