您的位置:首页 > 运维架构 > Linux

用crosstool-ng建立Linux 交叉编译环境

2010-12-01 21:27 429 查看
最近准备针对Linux内核和驱动做实验,但是当我用从前的制作的gcc-4.1.1编译最新的Linux内核的时候发现因为编译器太旧了无法编译,所以决定在做一个新的可以使用的。早就知道crosstool-ng这个工具了,但是去年使用了以后发现编译出的库文件不对(我要编译armv4的,结果编译出了v5的),所以只留下了记录,没有写文档。这次编译成功了,经过编译u-boot、Linuxkernel、busybox,并制作了根文件系统做测试,都没有问题,这才决定写一份文档放到博客来。好的,闲话不多说,现在就是见证制作过程的时刻。   首先可以去crosstool-ng的主页了解一下这个工具,从那里我们可以知道他是根据crosstool写的。   本文档的重点参考资料:用crosstool-ng建立arm-linux交叉工具链一、下载crosstool-ng,并为使用安装必要的软件。  crosstool-ng的下载地址是:http://ymorin.is-a-geek.org/download/crosstool-ng/  值得注意的是,下载里最新的crosstool-ng以后,记得在到http://ymorin.is-a-geek.org/download/crosstool-ng/01-fixes/看看有没有相应的补丁,有得话一起下载下来。  我这次使用的是1.6.1。  使用crosstool-ng必须安装一些开发用的软件,在ubuntu下必须安装(使用apt):
libncurses5-devbisonflextexinfoautomakelibtoolpatchgcjcvscvsdgawk
 根据用crosstool-ng建立arm-linux交叉工具链的介绍,最好手动安装一下termcap。二、解压、打补丁(如果有)并建立工作目录。  crosstool-ng和crosstool不同的地方之一就是:她并不是一下载下来就可以使用了,必须先配置安装。  将下载下来的crosstool-ng-X.Y.Z.tar.bz2解压到你为她准备的工作目录(这里假设为${CROSSTOOLNG}),并建立安装和编译目录。
mkdircrosstool-ng-1.6.1_build  #这次编译新交叉编译器的工作目录
mkdircrosstool-ng-1.6.1_install #crosstool-ng的安装目录
cdcrosstool-ng-1.6.1       #进入解压后的crosstool-ng目录
patch-p1<  <补丁文件>           
#
给crosstool-ng打补丁(如果有)
./configure--prefix=${CROSSTOOLNG}/crosstool-ng-1.6.1_install
                                  #配置crosstool-ng
make                              #编译crosstool-ng
makeinstall                      #安装crosstool-ng
 三、配置本次编译的交叉编译工具链  接下来就是配置你要编译的交叉编译工具链了,在crosstool-ng已很多已经做好的默认配置(位于crosstool-ng-X.Y.Z/samples目录下),你只要针对其进行修改就好了。对于编译器组件部分的版本最好不要修改,因为那个配搭应该是经过测试后的最高本版了,但内核版本可以修改。
cd
${CROSSTOOLNG}
/crosstool-ng-1.6.1_build/  
#进入编译新交叉编译器的工作目录
cp../crosstool-ng-1.6.1/samples/arm-unknown-linux-gnueabi/*./
#拷贝默认配置文件到工作目录
mvcrosstool.config .config
#修改文件名
../crosstool-ng-1.6.1_install/bin/ct-ngmenuconfig
进入
menuconfig,开始修改配置。
下面我只说说针对armv4t需要修改的地方,别的构架等有了板子测试再说:1、已下载好的源码包路径和交叉编译器的安装路径。Pathsandmiscoptions ---> (${HOME}/development/crosstool-ng/src)Localtarballsdirectory  保存源码包路径 (${HOME}/development/x-tools/${CT_TARGET})Prefixdirectory 交叉编译器的安装路径这两个请依据你的实际情况来修改。2、修改交叉编译器针对的构架 Targetoptions --->         ***Targetoptimisations***          (armv4t)Architecturelevel          (arm9tdmi)EmitassemblyforCPU             (arm920t)TuneforCPU以上这几个参数是如何得出的可以参考gcc的man手册,你可以在你下载的gcc-4.3.2.tar.bz2解压后找到,她的位置是gcc-4.3.2/gcc/doc/gcc.1。打开方式:
man./gcc.1
你可以在其中找到:
...... ARMOptions......-mcpu=name  (
EmitassemblyforCPU
)           ThisspecifiesthenameofthetargetARMprocessor.GCCusesthis           nametodeterminewhatkindofinstructionsitcanemitwhengener‐           atingassemblycode.Permissiblenamesare:arm2,arm250,arm3,           arm6,arm60,arm600,arm610,arm620,arm7,arm7m,arm7d,arm7dm,           arm7di,arm7dmi,arm70,arm700,arm700i,arm710,arm710c,arm7100,           arm7500,arm7500fe,arm7tdmi,arm7tdmi-s,arm8,strongarm,stron‐           garm110,strongarm1100,arm8,arm810,arm9,arm9e,arm920,arm920t,           arm922t,arm946e-s,arm966e-s,arm968e-s,arm926ej-s,arm940t,           arm9tdmi,arm10tdmi,arm1020t,arm1026ej-s,arm10e,arm1020e,           arm1022e,arm1136j-s,arm1136jf-s,mpcore,mpcorenovfp,           arm1156t2-s,arm1176jz-s,arm1176jzf-s,cortex-a8,cortex-r4,cor‐           tex-m3,xscale,iwmmxt,ep9312.       -mtune=name  
(TuneforCPU)
           Thisoptionisverysimilartothe-mcpu=option,exceptthat           insteadofspecifyingtheactualtargetprocessortype,andhence           restrictingwhichinstructionscanbeused,itspecifiesthatGCC           shouldtunetheperformanceofthecodeasifthetargetwereof           thetypespecifiedinthisoption,butstillchoosingtheinstruc‐           tionsthatitwillgeneratebasedonthecpuspecifiedbya-mcpu=           option.ForsomeARMimplementationsbetterperformancecanbe           obtainedbyusingthisoption.       -march=name 
(Architecturelevel)
           ThisspecifiesthenameofthetargetARMarchitecture.GCCuses           thisnametodeterminewhatkindofinstructionsitcanemitwhen           generatingassemblycode.Thisoptioncanbeusedinconjunction           withorinsteadofthe-mcpu=option.Permissiblenamesare:           armv2,armv2a,armv3,armv3m,armv4,armv4t,armv5,armv5t,           armv5te,armv6,armv6j,armv6t2,armv6z,armv6zk,armv7,armv7-a,           armv7-r,armv7-m,iwmmxt,ep9312.
......
3、关闭JAVA编译器,避免错误。 我这里用ubuntu9.10编译JAVA编译器的时候会出错,也许是host的gcj的问题,反正我不用JAVA,所以就直接关闭了。如果有兄弟知道如何修正记得通知一声!!Ccompiler --->     ***Additionalsupportedlanguages:***     [N]Java errorlog:
[INFO] =================================================================[INFO] Installingfinalcompiler[EXTRA]   Configuringfinalcompiler[EXTRA]   Buildingfinalcompiler[ERROR]   jar:internalerror:[ERROR]   make[4]:***[libgcj-4.3.2.jar]Error1[ERROR]   make[3]:***[all-recursive]Error1[ERROR]   make[2]:***[all-target-libjava]Error2[ERROR]   make[1]:***[all]Error2[ERROR]   Buildfailedinstep'Installingfinalcompiler'[ERROR]   Errorhappenedin'/home/tekkaman/development/research/crosstool-ng/crosstool-ng-1.6.1_install/lib/ct-ng-1.6.1/scripts/functions'infunction'CT_DoExecLog'(lineunknown,sorry)[ERROR]         calledfrom'/home/tekkaman/development/research/crosstool-ng/crosstool-ng-1.6.1_install/lib/ct-ng-1.6.1/scripts/build/cc/gcc.sh'atline#350infunction'do_cc'[ERROR]         calledfrom'/home/tekkaman/development/research/crosstool-ng/crosstool-ng-1.6.1_install/lib/ct-ng-1.6.1/scripts/crosstool-NG.sh'atline#562infunction'main'[ERROR]   Lookat'/home/tekkaman/development/x-tools/arm-tekkaman-linux-gnueabi/build.log'formoreinfoonthiserror.[ERROR] (elapsed:67:10.67)[67:11]/make:***[build]错误2
               4、根据参考资料,禁止内核头文件检测(只起到节约时间的作用(不到1S的时间),不推荐禁用)OperatingSystem ---> [N]    Checkinstalledheaders5、增加编译时的并行进程数,以增加运行效率,加快编译。Pathsandmiscoptions --->  ***Buildbehavior***  (4)Numberofparalleljobs  这个数值不宜过大,应该为CPU数量的两倍。由于我的CPU是双核的,所以我填了4.6、一些个性化的修改(可以不修改)Toolchainoptions --->     ***Tuplecompletionandaliasing***       (tekkaman)Tuple'svendorstring这样产生的编译器前缀就是:arm-tekkaman-linux-gnueabi-Ccompiler --->      (crosstool-NG-${CT_VERSION}-tekkaman)gccIDstring配置好以后保存。最后,内核源码的版本号修改,请直接修改
crosstool-ng-1.6.1_build目录下的.config文件,不止一处,有关的都要修改。
有:
CT_KERNEL_VERSION=CT_KERNEL_V_2_6_??_?=yCT_LIBC_GLIBC_MIN_KERNEL=
如果再次
../crosstool-ng-1.6.1_install/bin/ct-ngmenuconfig,这个修改又会复原,必须再次手工修改。你也可以选择修改crosstool-ng-X.Y.Z_build/config/kernel/linux.in等文件,只是比较麻烦,但这可以彻底解决,实现在界面中增加内核版本。
四、为加快速度,根据配置自行下载相应的软件包。(选做)  虽然crosstool-ng发现找不到软件包的时候会自动下载,但是比较慢。根据这次的配置情况(查看“.config”文件),我预先下载了以下的软件包:binutils-2.19.1.tar.bz2glibc-2.9.tar.gz         dmalloc-5.5.2.tgz       glibc-ports-2.9.tar.bz2  mpfr-2.4.2.tar.bz2duma_2_5_15.tar.gz      gmp-4.3.1.tar.bz2        ncurses-5.7.tar.gzecj-latest.jar      libelf-0.8.12.tar.gz     sstrip.cgcc-4.3.2.tar.bz2       linux-2.6.33.1.tar.bz2  strace-4.5.19.tar.bz2gdb-6.8.tar.bz2        ltrace_0.5.3.orig.tar.gz下载完之后,记得将这些软件包放在配置时指定的文件夹。五、开始编译。
../crosstool-ng-1.6.1_install/bin/ct-ngbluid
我的笔记本用了大概40多分钟编译完成。六、编译好后的交叉编译器。编译器位于:${你配置时确定的路径}/x-tools/arm-tekkaman-linux-gnueabi/bin库文件位于:${你配置时确定的路径}/x-tools/arm-tekkaman-linux-gnueabi/arm-tekkaman-linux-gnueabi/lib
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐