300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > powerpc linux交叉编译器 [转载]搭建PowerPC交叉编译器 二

powerpc linux交叉编译器 [转载]搭建PowerPC交叉编译器 二

时间:2018-08-09 07:46:39

相关推荐

powerpc linux交叉编译器 [转载]搭建PowerPC交叉编译器 二

第三部分 搭建过程

3.1 创建过程概述

这个GUN工具链的创建过程可以分为5步

Step 1:安装基于PowerPC的linux头文件;

备注:创建头文件是编译库文件所必须的,这一步只要在创建glibc库文件之前就可以了。

Step 2:安装binutils工具包;

Step 3:安装gcc引导编译器;

备注:这一步是创建一个最简单的基于powerpc的gcc编译器,该编译器只支持c语言。它是为Step

5完整编译gcc工具链做准备的。

Step 4:安装glibc库

Step 5:完整安装gcc编译器

备注:此时编译器将会支持c/c++语言。上面的5个步骤中,除了Step

1仅仅是拷贝头文件,Step 5不需要再次解压gcc压缩包之外(Step

3已经进行了解压了),其它的三个步骤都会包括:解压缩包,配置编译安装环境,编译,安装四个步骤。

3.2 安装GUN交叉编译器的详细过程

3.2.1 安装linux内核头文件

使用命令:

$cd $PRJROOT/kernel

$cd linux-2.6.38

$mkdir -p

$TARGET_PREFIX/include

解释:在/home/tom/target-project/powerpc-module/tools/powerpc-tom-linux-gnu目录下建立include目录

$make mrproper

解释:确保linux-2.6.38内核源码是干净的。

$make ARCH=powerpc

headers_check

解释:产生include/linux/version.h

$make ARCH=powerpc INSTALL_HDR_PATH=dest

headers_install

解释:把powerpc构建的头文件安装在当前目录下得dest目录中

$cp -rv dest/include/*

$TARGET_PREFIX/include

解释:再把dest目录中的所有内容移动到$TARGET_PREFIX/include目录中

$rm –rf dest

解释:删除dest目录

执行完的结果如下:

备注:除了使用上面的工具直接安装之外,也可以手动安装,使用下面的命令:

$mkdir -p

${TARGET_PREFIX}/include

$cp -r include/linux/

$TARGET_PREFIX/include

$cp -r include/asm-generic/

$TARGET_PREFIX

$cp -r arch/powerpc/include/asm/

$TARGET_PREFIX/include

3.2.2 安装binutils工具包

Binutils工具包中的工具主要用于操纵二进制obj文件,其中最重要的工具是GNU汇编器as和链接器ld。

Binutils工具包中的工具如下表所示:

工具功能

asGNU的汇编器

ldGNU的链接器

gaspGNU汇编预处理器

ar产生、修改和解开一个存档文件

nm列出obj文件中的所有符号名

objcopy 将某种格式的目标文件转化成另外格式的目标文件

objdump 显示二进制obj文件的信息

ranlib为一个存档文件产生一个索引,并将这个索引存入存档文件中

readelf 显示elf格式的obj文件信息

size显示目标文件各个节的大小和目标文件的大小

strings 打印出目标文件中可以打印的字符串

strip剥掉目标文件的所有的符号信息

c++filt 转换C++重载函数产生到汇编语言标签到对应的函数名

addr2line 把地址转成源文件中对应的行号

安装命令:

$ cd $PRJROOT/build-tools

$ tar xvf binutils-2.22.tar.gz

$ cd

$PRJROOT/build-tools/build-binutils

$ ../ binutils-2.22/configure

--target=$TARGET --prefix=$PREFIX

解释:

--target=$TARGET:指定工具包中工具的前缀

--prefix=$PREFIX:指定binutils工具包安装的目录

$make

$make install

执行成功后的结果如下图所示:

备注:这一步的编译和前后没有什么关联,所以基本上不会出错,O(∩_∩)O~

3.2.3 安装gcc引导器

和binutils工具包众多的工具相比,gcc软件包中只有一个gcc编译器,外加一些支持包,像运行库之类的。我们现在将要编译并安装的gcc引导器仅支持c语言,我们需要用gcc引导器来编译器glibc库,一旦在step

4中glibc库编译好之后,我们将会step 5中重新编译gcc软件包,以使它支持c/c++语言,“引导器”就是这么来的。

$cd $PRJROOT/build-tools

$ tar xvf gcc-4.6.2.tar.bz2

$tar xvf gmp-5.0.4.tar.bz2

$mv gmp-5.0.4 ./gcc-4.6.2/gmp

解释:解压缩gmp-5.0.4.tar.bz2,并把解压之后的文件移到到gcc之中

$tar xvf mpc-0.9.tar.gz

$mv mpc-0.9 ./gcc-4.6.2/mpc

$tarxvf

mpfr-3.0.1.tar.gz

$mvmpfr-3.0.1

./gcc-4.6.2/mpfr

$cd

$PRJROOT/build-tools/build-boot-gcc

解释:进入build-boot-gcc目录

$ ../gcc-4.6.2/configure --target=$TARGET

--prefix=$PREFIX --disable-shared --without-headers --with-newlib

--enable-languages=c --disable-decimal-float --disable-libgomp

--disable-libmudflap --disable-libssp --disable-threads

--disable-multilib

解释:

--target=$TARGET --prefix=$PREFIX 同时3.2.2中binutils

--disable-shared:禁用创建共享库

--without-headers:不使用系统头文件,因为这是跨平台编译器,我们还没有建立目标板上的系统头文件。一旦glibc编译之后,我们再次编译gcc时,就是可以使用针对目标板上的系统头文件了。

--with-newlib:不适用c库文件,因为我们还没有建立glibc库。

--enable-languages=c:gcc引导器仅仅支持c语言

--disable-decimal-float:不支持浮点运算

--disable-libgomp:不创建libgomp使用的运行库

--disable-libmudflap:不创建libmudflap使用的运行库

--disable-libssp:不适用运行库的栈崩溃保护机制

--disable-threads:阻止gcc选择多线程保护的头文件

--disable-multilib:进程产生multilib库

接着执行:

$make all-gcc

解释:编译gcc引导器

$make all-target-libgcc

解释:编译libgcc库

$make install-gcc

解释:安装gcc引导器,安装在和binutils工具包相同的目录中。

$make install-target-libgcc

解释:安装libgcc到/home/tom/target-project/powerpc-module

/tools/lib/gcc/powerpc-tom-linux-gnu/4.6.2/libgcc.a

执行结果如下:

3.2.4 编译glibc库

Glibc库保护很多库文件,目标系统上几乎所有的程序的运行都要依赖这个库。要注意的是,我们通知所说的C库只是glibc中的一个库。

在正式我们要对glibc-2.14中的Makeconfig中的文件进行修改,使用命令如下:

$cd $PRJROOT/build-tools

$ tar xvf glibc-2.14.tar.bz2

$cd $PRJROOT/glibc-2.14

$cp -v Makeconfig{,.orig}

$sed -e 's/-lgcc_eh//g' Makeconfig.orig

> Makeconfig

$cd ..

解释:上述命令的左右就是删除Makefileconfig文件中的-lgcc_eh选项,即就是把Makefileconfig中的第555行的内容:

libgcc_eh := -lgcc_eh $(libunwind)

该修改为:

libgcc_eh :=$(libunwind)

所以如果不用命令的话,也可以手动删除-lgcc_eh

如果不删除的话,在编译glibc时,会出现“cannot find -lgcc_eh”的错误。

经过上面的修改之后,我们就可以执行命令来编译安装glibc库了。

$tar xvf

glibc-ports-2.14.tar.bz2

$mv glibc-ports-2.14

./glibc-2.14/ports

$cd

$PRJROOT/build-tools/build-glibc

$CC=powerpc-tom-linux-gnu-gcc

../glibc-2.14/configure --host=$TARGET --prefix="/usr"

--enable-add-ons --with-headers=$TARGET_PREFIX/include

libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes

解释:

$CC=powerpc-tom-linux-gnu-gcc:我们现在编译的glibc库是运行在目标机器上,运行环境是目标机系统,所以我们的用的gcc编译器是我们的gcc引导器。

--host=$TARGET:因为我们的库是运行在目标机器上,所以从glibc库的角度来说,主机是目标平台。

--prefix="/usr":

--with-headers=$TARGET_PREFIX/include:使用我们在3.2.1安装的头文件;

libc_cv_forced_unwind=yes

libc_cv_c_cleanup=yes

然后接着执行命令:

$make

$make install_root=$TARGET_PREFIX

prefix="" install

安装完毕之后的示意图如下:

3.2.5完全安装gcc

现在我们将完全安装支持c/c++语言的gcc编译器,因为在3.2.3安装gcc引导编译器是已经解压了gcc安装包,现在只有直接编译安装就可以了。

但是在编译安装之前,我们要对3.2.4编译的$TARGE_PREFIX/lib目录下的两个库的配置文件进行修改。

第一个是:修改$TARGE_PREFIX/lib目录下的libc.so文件。

修改之前

将原内容:

OUTPUT_FORMAT(elf32-powerpc)

GROUP ( /lib/libc.so.6

/lib/libc_nonshared.aAS_NEEDED ( /lib/ld.so.1 )

)

修改为:用$cp libc.so libc.so.orig备份一下libc.so

OUTPUT_FORMAT(elf32-powerpc)

GROUP (libc.so.6

libc_nonshared.aAS_NEEDED (ld.so.1 )

)

否则在完全编译gcc库时会出现“/bin/ld: cannot find /lib/libc.so.6…”之类的错误。

原因是:powerpc-tom-linux-gnu-ld会在Fedora

14的系统目录/lib中寻找我们在3.2.4中编译的glibc,而不是glibc库所在的$TARGE_PREFIX/lib中(即当前目录),所以我们要去除绝对路径。

第二个是:修改/$TARGET_PREFIX/lib目录下得libpthread.so

修改之前用$cp libpthread.so libpthread.so.orig备份一下libpthead.so

原内容:

OUTPUT_FORMAT(elf32-powerpc)

GROUP ( /lib/libpthread.so.0

/lib/libpthread_nonshared.a )

修改之后:

OUTPUT_FORMAT(elf32-powerpc)

GROUP ( libpthread.so.0

libpthread_nonshared.a )

否则会出现类似“configure: error: Pthreads are required to build

libgomp”这类的错误,原因同上。

修改了这两个文件之后,我们就可以正式完整的gcc交叉编译器了,因为我们在2.3.3安装gcc引导编译器时,已经解压了gcc-4.6.2.tar.bz2压缩包,现在只要进入gcc-4.6.2目录即可。

使用下面的命令:

$cd

${PRJROOT}/build-tools/build-gcc

$../gcc-4.6.2/configure --target=$TARGET

--prefix=$PREFIX --enable-languages=c,c++

$make all

解释:在3.2.3建立引导gcc编译器时,我们使用了make all-gcc命令,该命令只编译了gcc安装包(仅支持c语言),make

all将会同时编译gcc和g++安装包,这样的会我们的编译器就会支持c/c++语言。

$make install

解释:在3.2.3建立引导gcc编译器时,我们使用了make install-gcc命令,现在用make

install命令,原因同上。

编译完成之后的示意图:

至此我们的基于PowerPC的gcc交叉编译器已经顺利安装完成了,O(∩_∩)O~

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。