搭建交叉编译环境

转载:http://blog.chinaunix.net/uid-28685940-id-3889921.html

交叉编译工具链是一个由编译器、连接器和解释器组成的综合开发环境,交叉编译工具链主要由binutilsgccglibc 3个部分组成。有时出于减小 libc 库大小的考虑,也可以用别的 c 库来代替 glibc,例如 uClibcdietlibc newlib。建立交叉编译工具链是一个相当复杂的过程,如果不想自己经历复杂繁琐的编译过程,网上有一些编译好的可用的交叉编译工具链可以下载,但就以学习为目的来说读者有必要学习自己制作一个交叉编译工具链

构建ARM Linux交叉编译工具链

构建交叉编译器的第一个步骤就是确定目标平台。在GNU系统中,每个目标平台都有一个明确的格式,这些信息用于在构建过程中识别要使用的不同工具的正确版本。因此,当在一个特定目标机下运行GCC时,GCC便在目录路径中查找包含该目标规范的应用程序路径。GNU的目标规范格式为CPU-PLATFORM-OS。例如x86/i386 目标机名为i686-pc-linux-gnu。本章的目的是讲述建立基于ARM平台的交叉工具链,所以目标平台名为arm-linux-gnu


通常构建交叉工具链有3种方法:


方法一:分步编译和安装交叉编译工具链所需要的库和源代码,最终生成交叉编译工具链。该方法相对比较困难,适合想深入学习构建交叉工具链的读者。如果只是想使用交叉工具链,建议使用方法二或方法三构建交叉工具链。


方法二:通过Crosstool脚本工具来实现一次编译生成交叉编译工具链,该方法相对于方法一要简单许多,并且出错的机会也非常少,建议大多数情况下使用该方法构建交叉编译工具链。

 

方法三:直接通过网上(ftp.arm.kernel.org.uk) 下载已经制作好的交叉编译工具链。该方法的优点不用多说,当然是简单省事,但与此同时该方法有一定的弊端就是局限性太大,因为毕竟是别人构建好的,也就是 固定的没有灵活性,所以构建所用的库以及编译器的版本也许并不适合你要编译的程序,同时也许会在使用时出现许多莫名的错误,建议读者慎用此方法。


对于不同的嵌入式目标开发过程来说,搭建交叉编译环境的过程基本类似,包括操作系统以及连接器,编译器、调试器在内的软件开发工具。

一个完整的linuxC研发环境包括以下三个组成:

1:函数库glibc

linuxC的主要函数库

2:编译器GCC


3:系统头文档glibc_header

缺少系统头文档的话,很多用到系统功能的C程序将无法编译


交叉编译工具需要由binutils,GCC,glibc几个部分组成

(1)      
binutils:一套用来构造和使用二进制的工具集,由下面几个部分组成

  
as   GNU汇编器 
,将汇编语言编译成二进制目标代码

  
GAS  linux的标准汇编器,它只能编译x86的汇编语言

  
ld  GNU连接器


  
add2line:地址转换为文件名或行号对,以便调试程序

  
gasp:汇编宏处理器

   mn:从目标代码文件中列举所有的变量(包括变量值和变量类型),如果没有指定目标文件,则默认为a.out文件

  objcopy:该工具使用GNU BSD库,它可以把目标文件的内容从一种文件格式复制到另一种格式的目标文件

  obdump:显示目标文件信息

  size:列出目标模块或文件的代码大小

  strings:打印可打印的目标代码字符

  strip:放弃所有符合连接

  c++filt:链接器ld使用该命令可以过滤C++符号和java符号,防止重载函数冲突

  gprof:显示程序调用段的各种数据

交叉开发环境的建立步骤:

1)下载源文件、补丁和建立编译目录

2)建立内核头文件

3)建立二进制工具(binutils

4)建立初始编译器(bootstrap gcc

5)建立C

6)建立全套编译器(full gcc

7)验证交叉编译工具链

8)制作交叉编译器

使用方法一即一般的方法,具体如下:

1:下载源文件、补丁和建立编译目录

(1)选定软件版本号:选择软件版本号时,要先看看glibc源代码中的INSTALL文件,此文件列举了该版本的glibc编译时所需的binutilsgcc版本号

  在编译glibc时,要用到linux内核中的include目录的内核头文件,如果发现有变量没有定义而导致编译失败,就改变内核版本号,如果没有完全的把握保证改的内核改完全了,就不用动内核,而是把内核的版本号降低或升高来适应glibc

工具链所需的源码包:

     
 Linux内核源码包:linux-2.6.XX.tar.bz2   (下载地址:http://www.kernel.org

      
二进制工具集源码包:binutils-2.XX.tar.bz
(下载地址:http://ftp.gnu.org/gnu/binutils/

      
gcc源码包:gcc-3.x.x.tar.bz2   (下载地址:http://ftp.gnu.org/gnu/gcc/

      
c库源码包:glibc-2.x.x-tar.bz  (下载地址:http://ftp.gnu.org/gnu/glibc/

    
            glibc-linuxthreads-2.x.x.tar.bz

      
gdb源码包:gdb-6.x.tar.bz       (下载地址:http://ftp.gnu.org/gnu/gdb/

http://www.linuxfromscratch.org/下载gcc的补丁包,补丁包的后缀为“.patch

ftp://ftp.arm.linux.org.uk/pub/linux/arm/kernel/v2.6/下载内核的补丁包

 2):建立工作目录

   首先建立工作目录,工作目录就是在什么目录下构建交叉工具链,目录的构建一般没有特别的要求,可以根据个人喜好建立。以下所建立的目录是作者自定义的

#cd opt/embedsky/

#mkdir arm_linux

再在这个工作目录arm_linux下建立3个目录 build-toolskernel tools。具体操作如下:

# cd arm_linux


# mkdir build-tools kernel tools


其中各目录的作用如下。


   build-tools 用来存放下载的binutilsgccglibc等源代码和用来编译这些源代码的目录;


   kernel 用来存放内核源代码及补丁


   tools 用来存放编译好的交叉编译工具和库文件。


3)建立环境变量(# vi etc/profile ,在profile文件中添加PATH路径)


该步骤的目的是为了方便重复输入路径,因为重复操作每件相同的事情总会让人觉得很麻烦,如果读者不习惯使用环境变量就可以略过该步,直接输入绝对路径就可以。声明以下环境变量的目的是在之后编译工具库的时候会用到,很方便输入,尤其是可以降低输错路径的风险。


# export PRJROOT=/ opt/embedsky/ arm_linux/


# export TARGET=arm-linux


# export PREFIX=$PRJROOT/tools


# export TARGET_PREFIX=$PREFIX/$TARGET


# export PATH=$PREFIX/bin:$PATH


注意,用export声明的变量是临时的变量,也就是当注销或更换了控制台,这些环境变量就消失了,如果还需要使用这些环境变量就必须重复export操作,所以有时会很麻烦。值得庆幸的是,环境变量也可以定义在bashrc文件中,这样当注销或更换控制台时,这些变量就一直有效,就不用老是export这些变量了。


体系结构和你的TAEGET变量的对应如下表


你可以在通过glibc下的config.sub脚本来知道,你的TARGET变量是否被支持,例如:


 


 

$./config.sub 
  arm-linux


 

arm-unknown-linux-gnu


 


在我的环境中,config.sub 在 glibc-2.2.3/scripts 目录下。


网上还有一些 HOWTO 可以参考,ARM 体系结构的《The GNU Toolchain for ARM Target
HOWTO》,PowerPC 体系结构的《Linux for
PowerPC Embedded Systems HOWTO》等。对TARGET的选取可能有帮助。


(4)复制建立交叉编译环境所需的源代码包到相应的目录下


  #cp
binutils-2.XX.tar.bz   /opt/embedsky/
arm_linux/


  #cp
gcc-x.x.x.tar.bz2     /opt/embedsky/
arm_linux/


  #cp
glibc-2.x.x-tar.bz    /opt/embedsky/
arm_linux/


  #cp
glibc-linuxthreads-2.x.x.tar.bz 
/opt/embedsky/ arm_linux/


  #cp
gdb-x.x.tar.bz      /opt/embedsky/
arm_linux/


  #cp
linux-2.6.XX.tar.bz2  /opt/embedsky/
kernel/


相应的补丁包也要一起拷贝过来


(5) 4. 建立编译目录


为了把源码和编译时生成的文件分开,一般的编译工作不在的源码目录中,要另建一个目录来专门用于编译。用以下的命令来建立编译你下载的binutils、gcc和glibc的源代码的目录。


$cd /opt/embedsky/ arm_linux


$mkdir build-binutils
build-boot-gcc build-gcc build-glibc gcc-patch


其中:


build-binutils-编译binutils的目录

build-boot-gcc-编译gcc 启动部分的目录

build-glibc-编译glibc的目录

build-gcc-编译gcc 全部的目录

gcc-patch-放gcc的补丁的目录


2:建立内核头文件


编译器需要通过系统内核的头文件来获得目标平台所支持的系统函数调用所需要的信息。对于Linux内核,最好的方法是下载一个合适的内核,然后复制获得头文件。需要对内核做一个基本的配置来生成正确的头文件;不过,不需要编译内核


  
#cd /opt/embedsky/kernel


   解压内核源代码:


  
#tar xvfj linux-2.6.XX.tar.bz2 –C


   给内核打补丁(根据情况选择):


 
#tar xvfj patch-2.x.x-rmkx.gz   ;解压源码包


  #cd
linux-2.6.x


 
#patch –p1< ../patch-2.x.x-rmkx


   编译内核生成头文件:


    修改linux-2.6.xmakefile文件以对平台进行配置


   
#vi makefile


    修改makefile的内容如下:


   
ARCH=arm CROSS_COMPIL=arm-linux-


    修改完成后保存,运行配置命令根据系统进行相关配置


#make
menuconfig


其中ARCH=arm表示是以 arm为体系结构,CROSS_COMPILE=arm-linux-表示是以arm-linux-为前缀的交叉编译器。也可以用config xconfig来代替menuconfig,推荐用make menuconfig,这也是内核开发人员用的最多的配置方法。注意在配置时一定要选择处理器的类型,这里选择三星的S3C2410System Type->ARM System
Type->/Samsung S3C2440)配置完成退出并保存,检查一下内核目录中的include/linux下是否生成了autoconf.hversion.h。这是编译glibc时要用到的,autoconf.hversion.h的文件存在,也说明了生成了正确的头文件

复制头文件到交叉编译工具链的目录,首先需要在/opt/embedsky/arm_linux/tools/arm-linux目录下建立工具的头文件目录inlcude,然后复制内核头文件到此目录下,具体操作如下:


# mkdir –p $TARGET_PREFIX/include


# cp –r $PRJROOT/kernel/linux-2.6.x/include/linux
$TARGET_PREFIX/include


# cp –r $PRJROOT/kernel/linux-2.6.x/include/asm-arm
$TARGET_PREFIX/include/asm


3:建立二进制工具(binutils


  
#cd /opt/embedsky/arm_linux


  
#tar xvfj binutils-2.x.x.tar.bz2


   然后进入build-binutils目录配置和编译binutils


  
#cd build-binutils


  
#../binutils-2.x.x/configure –target=$TARGET –prefix=$PREFIX


   --target选项是指我们生成的arm-linux工具(指定交叉工具的体系结构,所有运行在主机上的交叉工具都要配置这个选项),--prefix是指我们可执行文件的位置(指定路径前缀),


    会出现很多check,最后产生makefile文件


    执行上说操作后,将在build-binutils下看到一个makefile


    有了makefile后,来编译并安装binutils


     #make


     #make install


     安装完成后,我们会在/ opt/embedsky/ arm_linux/tools/bin内看到以下文件:



$ls / opt/embedsky/ arm_linux/tools/bin 
arm-linux-addr2line  arm-linux-gasp    arm-linux-objdump   arm-linux-strings    arm-linux-ar      arm-linux-ld        arm-linux-ranlib     arm-linux-strip   arm-linux-as        arm-linux-nm         arm-linux-readelf arm-linux-size      arm-linux-c++filt    arm-linux-objcopy  



4:建立初始编译器(bootstrap gcc


这一步的目的主要是建立arm- linux-gcc工具,注意这个gcc没有glibc库的支持,所以只能用于编译内核、BootLoader等不需要C库支持的程序,后面创建C库也要用到这个编译器,所以创建它主要是为创建C库做准备,如果只想编译内核和BootLoader,那么安装完这个就可以到此结束


   (1)进入/opt/embedsky/arm_linux(等价于$PRJROOT/arm_linux)目录下,将gcc源代码解压


    #cd
/opt/embedsky/arm_linux


    #tar xvzf
gcc-x.x.x.tar.gz


   (2)然后进入gcc.x.x.x目录给gcc打上补丁


    #cd gcc-x.x.x


    #patch –p1<
../gcc-x.x.x-2.patch


    #patch –p1<
../gcc-x.x.x-no-fixinc.patch


    #patch –p1<
../gcc-x.x.x-returntype-fix.patch


  
(3)配置并编辑t-linux文件


因为现在还没有glibc库的支持,所以需要简单配置一些简单选项


在我们编译并安装 gcc 前,我们先要改一个文件$PRJROOT/gcc/config/arm/t-linux


使用命令:#vi /$PRJROOT/gcc/config/arm/t-linux  打开文件,


把TARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer -fPIC

这一行改为TARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer -fPIC
-Dinhibit_libc -D__gthr_posix_h


(或者TARGET_LIBGCC2-CFLAGS +=  -Dinhibit_libc -D__gthr_posix_h


T_CFLAGS = -Dinhibit_libc
-D__gthr_posix_h


-Dinhibit_libc的意思是禁止使用libc,因为现在还没有编译出glibc库


你如果没定义 -Dinhibit,编译时将会报如下的错误





 

../../gcc-2.95.3/gcc/libgcc2.c:41: stdlib.h: No such
  file or directory


 

../../gcc-2.95.3/gcc/libgcc2.c:42: unistd.h: No such
  file or directory


 

make[3]: *** [libgcc2.a] Error 1


 

make[2]: *** [stmp-multilib-sub] Error 2


 

make[1]: *** [stmp-multilib] Error 1


 

make: *** [all-gcc] Error 2


 

如果没有定义 -D__gthr_posix_h,编译时会报如下的错误



 

In file included from gthr-default.h:1,


 

                
  from ../../gcc-2.95.3/gcc/gthr.h:98,


 

                
  from ../../gcc-2.95.3/gcc/libgcc2.c:3034:


 

../../gcc-2.95.3/gcc/gthr-posix.h:37: pthread.h: No
  such file or directory


 

make[3]: *** [libgcc2.a] Error 1


 

make[2]: *** [stmp-multilib-sub] Error 2


 

make[1]: *** [stmp-multilib] Error 1


 

make: *** [all-gcc] Error 2


 


 


还有一种与-Dinhibit同等效果的方法,那就是在你配置configure时多加一个参数-with-newlib,这个选项不会迫使我们必须使用newlib。我们编译了bootstrap-gcc后,仍然可以选择任何c库。


4)配置boostrap gcc、生成makefile


后面要用bootstrap gcc 来编译 glibc



  #cd build-boot-gcc



#../gcc-x.x./configure--target=$TARGET--prefix=$PREFIX--enable-languages=c--disable-threads
--disable-shared

这条命令中的 -target--prefix 和配置 binutils 的含义是相同的,其中选项--enable-languages=c表示只支持C语言,--disable-threads表示去掉thread功能,这个功能需要glibc的支持。--disable-shared表示只进行静态库编译,不支持共享库编译,这样就不依赖glibc了。


5)编译、安装


#make all-gcc


#make install-gcc


我们来看看 $PREFIX/bin 里面多了哪些东西


 

$ls $PREFIX/bin


 

你会发现多了 arm-linux-gcc 、arm-linux-unprotoize、cpp 和 gcov 几个文件。


Gcc-gnu 的 C 语言编译器


Unprotoize-
ANSI C 的源码转化为 K&R C 的形式,去掉函数原型中的参数类型。


Cpp-gnu的 C 的预编译器


Gcov-gcc 的辅助测试工具,可以用它来分析和优程序。


使用 gcc3.2 以及 gcc3.2 以上版本时,配置 boot-gcc 不能使用 --without-headers 选项,而需要使用 glibc 的头文件(因此需要指定内核头文件:#../gcc-x.x./configure--target=$TARGET--prefix=$PREFIX—with_header=/opt/embedsky/arm_linux/tools/arm-linux
/include --enable-languages=c--disable-threads --disable-shared)


5:建立C库(glibc


glibcGUN C库,它是编译Linux系统程序很重要的组成部分。安装glibc-2.3.2版本之前推荐先安装以下的工具:


   GNU make 3.79或更新;


   GCC 3.2或更新;


   GNU binutils 2.13或更新。


(1)首先解压
glibc-2.x.x.tar.gz 和 glibc-linuxthreads-2.x.x.tar.gz 源代码



$cd  /opt/embedsky/ arm_linux/ build-tools ($PRJROOT/build-tools )
$tar -xvzf glibc-2.x.x.tar.gz
$tar -xzvf glibc-linuxthreads-2.x.x.tar.gz --directory=glibc-2.x.x



(2)然后进入 build-glibc 目录配置 glibc,配置生成makefile



#cd build-glibc
#CC=arm-linux-gcc
#AS=arm-linux-as
#LD=arm-linux-ld ../glibc-2.2.3/configure --host=$TARGET --prefix="/usr" 
--enable-add-ons --with-headers=$TARGET_PREFIX/include



CC=arm-linux-gcc
是把 CC 变量设成你刚编译完的boostrap gcc,用它来编译你的glibc。--enable-add-ons是告诉glibc用 linuxthreads 包,在上面我们已经将它放入了 glibc 源码目录中,这个选项等价于 -enable-add-ons=linuxthreads。--with-headers
告诉 glibc 我们的linux 内核头文件的目录位置。


(3)配置完后就可以编译和安装 glibc


#make



#make install_root=$TARGET_PREFIX prefix="" install
然后还要修改libc.so





GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a)


改为

GROUP ( libc.so.6 libc_nonshared.a)


这样连接程序 ld 就会在 libc.so 所在的目录查找它需要的库,因为本机的/lib目录可能已经装了一个相同名字的库,一个为编译可以在你的宿主机上运行的程序的库,而不是用于交叉编译的。


6:建立全套编译器(full
gcc)



在建立bootstrap gcc 的时候,我们只支持了C。到这里,我们就要建立全套编译器,来支持C和C++。


#cd $PRJROOT/build-tools/build-gcc
#../gcc-2.95.3/configure --target=$TARGET --prefix=$PREFIX --enable-languages=c,c++



--enable-languages=c,c++ 告诉 full gcc 支持 c 和 c++
语言。


然后编译和安装你的 full gcc



#make all
#make install



我们再来看看 $PREFIX/bin 里面多了哪些东西



$ls $PREFIX/bin



你会发现多了 arm-linux-g++ 、arm-linux-protoize 和 arm-linux-c++ 几个文件。


G++-gnu的
c++ 编译器。


Protoize-与Unprotoize相反,将K&R C的源码转化为ANSI C的形式,函数原型中加入参数类型。


C++-gnu 的
c++ 编译器。


到这里你的交叉编译工具就算做完了,简单验证一下你的交叉编译工具。


用它来编译一个很简单的程序 helloworld.c


7:制作交叉调试器


(1)解压gdb源文件包


#cd /opt/embedsky/arm_linux


# tar xvzf gdb-7.0.tar.gz


(2)配置makefile


#cd gdb-7.0


#mkdir build-arm-linux


#cd build-arm-linux


#../configure –target=arm-linux prefix=/opt/embedsky/tools


(3)编译、安装


#make


#make install


安装完成后在目标文件夹/opt/embedsky/tools/bin内就可得到了arm-linux-gdb工具


(4)编译gdbserver


Gdbserver的源代码在gdb的gdbserver目录下:


#cd gdb-7.0


#cd gdbserver


#chmod u+x configure


#CC = arm-linux-gcc ./configure –host=arm-linux


#make


编译完成后,将生成gdbserver和gdbreplay可执行程序,复制到目标机的文件系统即可


方法二: 用Crosstool工具构建交叉工具链(http://www.kegel.com/crosstool/)


Crosstool是一组脚本工具集,可构建和测试不同版本的gccglibc,用于那些支持glibc的体系结构。它也是一个开源项目,下载地址是ftp://ftp.arm.linux.org.uk/pub/armlinux/toolchain/。用Crosstool构建交叉工具链要比上述的分步编译容易得多,并且也方便许多,对于仅仅为了工作需要构建交叉编译工具链的读者建议使用此方法


1:准备资源包


下载准备安装包:


crosstool-0.42.tar.gz       http://www.kegel.com/crosstool/


linux-2.6.10.tar.gz
    http://www.kernel.org


binutils-2.15.tar.bz2    http://ftp.gnu.org/gnu/binutils/


gcc-3.3.6.tar.gz        http://ftp.gnu.org/gnu/gcc/


glibc-2.3.2.tar.gz
     http://ftp.gnu.org/gnu/glibc/


glibc-linuxthreads-2.3.2.tar.gz
       http://ftp.gnu.org/gnu/glibc/


linux-libc-headers-2.6.12.0.tar.bz2    http://ep09.pld-linux.org/~mmazur/linux-libc-headers/


2:解压源程序包


#cd /opt/embedsky


# cp 
crosstool-0.42.tar.gz   
/opt/embedsky


#cp  linux-2.6.10.tar.gz   /opt/embedsky


#cp  binutils-2.15.tar.bz2  /opt/embedsky


#cp  gcc-3.3.6.tar.gz     /opt/embedsky


#cp  glibc-2.3.2.tar.gz
  /opt/embedsky


#cp  linux-libc-headers-2.6.12.0.tar.bz2  /opt/embedsky


#cp  glibc-linuxthreads-2.3.2.tar.gz  /opt/embedsky


#tar xvzf 
cross-3.2.tar.gz


3:建立脚本文件


接着需要建立自己的编译脚本,起名为arm.sh,为了简化编写arm.sh,寻找一个最接近的脚本文件demo-arm.sh作为模板,然后将该脚本的内容复制到arm.sh,修改arm.sh脚本,具体操作如下:


# cd crosstool-0.42


# cp demo-arm.sh arm.sh


# vi arm.sh


修改后的arm.sh脚本内容如下:


#!/bin/sh


set -ex


TARBALLS_DIR=/opt/embedsky/downloads # 定义工具链源码所存放位置。


RESULT_TOP=/opt/crosstool            # 定义工具链的安装目录


export TARBALLS_DIR RESULT_TOP


GCC_LANGUAGES="c,c++"                # 定义支持C, C++语言


export GCC_LANGUAGES


 创建/opt/crosstool目录


# mkdir -p $RESULT_TOP


编译工具链,该过程需要数小时完成。


#eval 'cat arm.dat gcc-3.3.6-glibc-2.3.2.dat'
sh all.sh --notest


echo Done.


4.建立配置文件


arm.sh脚本文件中需要注意arm.datgcc-3.3.6-glibc-2.3.2.dat两个文件,这两个文件是作为Crosstool的编译的配置文件。其中 arm.dat文件内容如下,主要用于定义配置文件、定义生成编译工具链的名称以及定义编译选项等。


KERNELCONFIG='pwd'/arm.config # 内核的配置


TARGET=arm-linux-                # 编译生成的工具链名称


TARGET_CFLAGS="-O"                # 编译选项


gcc-3.3.6-glibc-2.3.2.dat文件内容如下,该文件主要定义编译过程中所需要的库以及它定义的版本,如果在编译过程中发现有些库不存在时,Crosstool会自动在相关网站上下载,该工具在这点上相对比较智能,也非常有用。


BINUTILS_DIR=binutils-2.15


GCC_DIR=gcc-3.3.6


GLIBC_DIR=glibc-2.3.2


GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2


LINUX_DIR=linux-2.6.10


LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0


5.执行脚本


Crosstool的脚本文件和配置文件准备好之后,开始执行arm.sh脚本来编译交叉编译工具。具体执行命令如下:


# cd crosstool-0.42


# ./arm.sh


经过数小时的漫长编译之后,会在/opt/crosstool目录下生成新的交叉编译工具,其中包括以下内容:


arm-linux-addr2line  arm-linux-g++        arm-linux-ld         arm-linux-size


arm-linux-ar        arm-linux-gcc        arm-linux-nm         arm-linux-strings


arm-linux-as        arm-linux-gcc-3.3.6
  arm-linux-objcopy
   arm-linux-strip


arm-linux-c++      arm-linux-gccbug    arm-linux-objdump    fix-embedded-paths


arm-linux-c++filt arm-linux-gcov      arm-linux-ranlib  arm-linux-cpp      arm-linux-gprof    arm-linux-readelf


5.添加环境变量


然后将生成的编译工具链路径添加到环境变量PATH上去,添加的方法是在系统/etc/
bashrc文件的最后添加下面一行


Vi编辑器在bashrc文件中添加环境变量


#vi /etc/bashrc


export PATH=/opt/crosstool/gcc-3.3.6-glibc-2.3.2/arm-linux/bin:$PATH


设置完环境变量,也就意味着交叉编译工具链已经构建完成


方法三:使用ELDK构建交叉编译环境


ELDK的下载地址:


http://www.denx.de/wiki/view/DULG/ELDKAvailability  下载iso镜像文件,下载完成后不需要解压文件,只要一个mount命令就可以挂载到系统里面了,


拷贝iso文件到/opt/embedsky目录下


# cp arm-2007-01-22-uclibc.iso  /opt/embedsky


#cd /opt/embedsky


#mount –o loop arm-2007-01-22-uclibc.iso  /mnt


打开/mnt目录,里面有一个README.HTML文件,应该好好阅读一下,里面有安装和使用的说明


/opt/embedsky下面新建一个eldk目录,用这个目录作为eldk的安装目录


/opt/embedsky/eldk目录下执行以下命令,即可将eldk4.1安装到系统里面了


#cd /opt/embedsky/eldk


#/mnt/install arm


最后配置以下环境变量


编写.bashrc文件,在文件末加入以下几行环境变量


#vi /etc/bashrc


export CROSS_COMPILE=arm-linux-


export PATH=/opt/embedsky/edlk/bin: /opt/embedsky/edlk/usr/bin:$PATH


保存文件,重新登录系统,测试一下是否安装成功即可



下面是几个工具链的官方下载地址:


ftp://ftp.arm.linux.org.uk/pub/armlinux/toolchain/


ftp://ftp.handhelds.org/projects/toochain


http://ftp.snapgear.org/pub/snapgear/tools/arm-linux


http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition


天嵌交叉编译器的安装:


 第一步:将交叉编译工具 EABI_4.3.3_EmbedSky_20091210.tar.bz2解压到linux/opt/EmbedSky/目录下使用的命令如下:


# tar xvfj EABI_4.3.3_EmbedSky_20091210.tar.bz2
–C


第二步:解压完成后修改“/etc/profile”文件,使用的命令如下:


# gedit /etc/profile     ;打开profile文件


在打开的文件中添加如下内容(红色部分)


#Path
manipulation


   …….


   Pathmunge
/usr/local/sbin


#  pathmunge /opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/bin


   Pathmunge /opt/EmbedSky/4.3.3/bin


说明:#是用来屏蔽相关不需用的工具的,内容可能不一样,根据实际情况自己选择,方法是一样的


第三步:使用命令:#source /etc/profile  ,使其生效

原文地址:https://www.cnblogs.com/pengdonglin137/p/3308938.html