Chinaunix首页 | 论坛 | 博客
  • 博客访问: 83335
  • 博文数量: 22
  • 博客积分: 2200
  • 博客等级: 大尉
  • 技术积分: 640
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-16 22:20
文章分类
文章存档

2011年(1)

2008年(21)

我的朋友

分类: LINUX

2008-04-12 17:17:44

制作交叉工具链(转)
2007-12-10 10:14

制作交叉工具链(转)

1. 交叉编译
Crosscompile的意义在于在当前的系统下,编译出一套,可以在当前系统下运行的 gcc 和 libc ,而用这些东西,在当前系统下编译出适合目的 系统 用的可执行程序。

--with-cpu=CPU
在 gcc 命令行中加入"-mcpu=CPU"。鉴于"-mcpu"已经被反对使用,所以建议不要设置该选项,或者设为 --without-cpu 。
--without-tls
禁止编译支持线程本地存储(TLS)的库。使用这个选项将导致兼容性问题。
--enable-tls
指定目标系统支持TLS(线程本地存储),一般情况下不需要明确指定这个选项,因为 configure 脚本可以自动检测。仅在你认为检测不正确的情况下才使用这个选项明确指定。
--enable-cxx-flags=FLAGS
编译 libstdc++ 库文件时传递给编译器的编译标志,是一个引号界定的字符串。默认为空,表示使用环境变量 CXXFLAGS 的值

Binutils与GCC配置选项简介

Glibc Binutils GCC 配置选项简介

2 工具链
工具链的获取途径
从stracths自己制作工具链
从网络下载工具链
用网络下载的脚步自动生成工具链


2.1.1 从stracths自己制作工具链
2.1.1.1 在ubuntu下动手编译arm-elf工具
来源:

最近,再次拜读了youbest版主的大作——CLFS2.0原理分析,又结合Cross-Compiled Linux From Scratch - Version SVN-2.0.0-20060808-ARM一书的详细过程,觉得受益匪浅。自己也看了一些关于Linux系统的移植的文章,就有了一些疑问。
2.1.1.2 自己制作arm-linux交叉编译环境(一)-2.1.1.3 scratch篇
来源:
http://blog.csdn.net/chenzhixin/archive/2007/01/12/1481442.aspx
交叉编译是指在一台电脑上来编译另一种结构的电脑上的代码,编译生成的程序不是运行在本机上的,而是另一种结构的机子上(^_^,快晕了...),打个比方吧,比如我的系统是x86结构的,如果我需要编译一个arm结构的程序,那编译器等就都要重新弄过了,这个编译过程就叫做 交叉编译,在嵌入式开发中就必须要交叉编译,在开发主机x386上开发arm目标机上可以运行的代码
在<<嵌入式linux系统开发技术详解-基于arm>>这本书中,有一章是将怎样制作自己的交叉编译环境的,不过用的是gcc2.95,很早以前的东西了,而且不能编译linux.2.6的内核,为了锻炼自己,我就打算自己编译下,在网上一搜索,都是差不多的文章,比如 一步步制作自己的交叉编译环境,等,但版本都比较低,我想用最新的版本来编译,经过几天的google,发现个crosstool比较好用,只要稍微改动下就能自动编译,目前最新版本为0.43,最高支持gcc-4.1.1-glibc-2.3.6,下载地址为:
还有个LFS工程,这个工程是教会大家怎样从代码制作自己的小linux系统的,主页为 ,这个工程包含很多小工程,其中的CFLS是专门为跨平台用的(Cross Linux From Scratch) ,clfs sysroot 是用来测试新的编译方法的,SVN版本已经包含了对最新软件包的支持
BOOK下载地址为:

编译的时候用到的补丁包 :
编译用的软件包:

由于编译过程复杂,又可能碰到一些莫名其妙的错误,所以最好还是用别人已经弄好的
(arm-elf-toolchain)
)
强烈建议编译的过程中边编译边看clfs-sysroot文档中的cross-compier tool,也就是第5章,因为我是新手,不能保证编译的过程中会没有错误,或者编译后无法使用等等,所以.......
0:准备好所要用到的资料和其他准备工作
   1). 首页要准备好编译用的软件包:
      
    binutils-2.17.tar.bz2        

    gcc-4.1.1-tar.bz2            
    glibc-2.5.tar.bz2            
    glibc-ports-2.5.tar.bz2    
    gdb-6.6.tar.bz2              
    linux-header-2.6.20-rc4      (补丁自己打)

来源:
1。两种不同的方式,哪种更好?
在ARM上移植Linux系统,大体步骤是:移植Bootloader,Linux kernel移植,文件系统的移植。
在ARM上创建Linux系统,好像是先创建文件系统和安装必要的工具包,然后再去配置和编译内核。斗胆的问一句:这种方式做出的Linux系统能在ARM平台上跑起来么?
2。在ARM上创建Linux系统,因为针对ARM平台有好几个型号的处理器,而export CLFS_TARGET="arm-unknown-linux-gnu"对目标平台只是一个unknown,对后面的工作有影响么?
3。在ARM上创建Linux系统,到最后的时候才去配置和编译内核,在这一步才确定所用的处理器的具体型号,但再第六章已经完成了一些包的编译安装的工作,这有什么不妥么?这对整个创建的系统有影响么?
4。在ARM上创建Linux系统,有没有考虑在ARM目标平台上所使用的文件系统?一般ARM上都是flash的存储器。
5。在ARM上创建Linux系统,如果我想去装一个应用程序,是在第六章去编译安装么。

2.1.2 从网络下载工具链

直接通过网上下载已经制作好的交叉编译工具链。该方法的优点是简单省事,但与此同时该方法有一定的弊端就是局限性太大,因为毕竟是别人构建好的,也就是固定的没有灵活性,所以构建所用的库以及编译器的版本也许并不适合你要编译的程序,同时也许会在使用时出现许多莫名的错误,建议读者慎用此方法
2.1.2.1 Sourcery G++
是一种完善、可靠、方便的基于GNU工具链的软件开发环境。
完善性:
它能够提供创建应用程序的一切工具,包含一个增强的基于Eclipse的集成开发环境和一个完整的GUN工具链:优化的ISO C/C++ 编译器,一个灵活的汇编器,一个强大的连接器,实时库,一个基于汇编级的源代码调试器。Sourcery G++可以在GNU / Linux和微软Windows上运行。支持多种CPU芯片和操作系统.

可靠性:
Sourcery G++包含了最新的对GNU 工具链的改进。CodeSourcery 已经在它的extensive hardware lab上通过很多的测试对Sourcery G++进行了验证。CodeSourcery同时提供更广泛的支持。
   
方便性:
通过 Sourcery G++ graphical installer就可以安装Sourcery G++,很方便的用Sourcery G++ IDE来编译和调试我们的应用程序。
Sourcery G++有专业版(企业版)和个人版,可以通过Compare Sourcery G++ editions 来决定哪个版本对自己最合适。
GNU C & C++ Compilers
GNU Assembler & Linker
C & C++ Runtime Libraries
GNU Debugger
Debug Sprites
Eclipse IDE
Access to Updates
GNU/Linux Prelinker
Unlimited Support(个人版本没有)
企业版本和个人版本没什么大的区别,以上的特性基本上都具有,唯一不同的是企业版能无限支持。
我们可以通过:下载最新版本
我现在制作出了GCC 4.1.x的toolchain,我知道从GCC 4.0.x开始就支持EABI了,但是我希望制作一个使用EABI的根文件系统。
通过测试我也已经确认,使用Gcc 4.1.x编译内核,在不开启EABI Feature的情况下,可以在使用Gcc 3.4.x制作的根文件系统中运行。
问题是,我需要开启EABI Feature编译内核,但这要求一个支持EABI的根文件系统,有谁有类似的经验?
嵌入式Linux开发中使用的CPU速度往往向对不会太高,因此,尽可能提高代码的性能就非常必要。通常开发人员应该对该CPU的具体型号有一定的了解,以便启用编译器中对该型号的优化,以ARM为例,我们可以通过 -march=armv5te 和 -mtune=arm9tdmi 来对代码在ARM9上的运行进行优化。有时这些优化体现出来的性能改善是比较大的,我曾对比过一些复杂算法的代码优化前后的性能(执行速度),都有一定的提升
2.1.2.2 arm-linux-gcc-3.4.1.tar.bz2下载
2.1.3 用网络下载的脚步自动生成工具链
buildroot-20070205
用于生成linux操作系统下的交叉编译工具链和嵌入式linux系统的根文件系统,支持x86、arm、powerpc等处理器
来源:
croostool-0.43
下载地址: (tarball)
Howto文档:
制作工具链的tarball搭配情况:
详细步骤,以制作制作arm-linux-gcc-3.4.5-glibc-2.3.5工具链为例子.
制作之前确保你的机子上有如下几个工具:bison flex build-essential。build-essential 主要是用于提供GCC、GLIBC等必要的编译资源,一般做开发的人员机子上应该都会有的。如果没有,对于ubuntu用户:sudo apt-get install build-essential bison flex.
用croostool-0.43制作arm-linux-gcc-3.4.4-glibc-2.3.5工具链
cd /opt/workspace/croostool-0.43
vim demo-arm.sh
以下两个变量可以修改成自己需要的目录:
TARBALLS_DIR=/opt/workspace/downloads
RESULT_TOP=/opt/workspace/toolchains
如果需要编译哪个版本工具链那就把以#开头的如下条目打开

eval `cat arm.dat gcc-3.4.4-glibc-2.3.5.dat` sh all.sh --notest
我编译的是
arm-linux-gcc-3.4.4-glibc-2.3.5 工具链,所有打开的选项是:
eval `cat arm.dat gcc-3.4.4-glibc-2.3.5.dat` sh all.sh --notest
这样就会把下载到/opt/workspace/downloads目录下的tarball(gcc-3.4.5.tar.bz2 glibc-2.3.5.tar.bz2 binutils-2.15.tar.bz2
linux-libc-headers-2.6.12.0.tar.bz2 )解压缩到目录
/opt/workspace/crosstool-0.43/build/arm-unknown-linux-gnu/gcc-3.4.5-glibc-2.3.5
如果/opt/workspace/downloads没有这些包,那么将会从网上下载,如果编译的时候不需要每次都作解包这个步骤,那么我们可以在eval `cat arm.dat gcc-3.4.4-glibc-2.3.5.dat` sh all.sh --notest 后面机上--nounpack的选项
gcc-3.4.5.tar.bz2 glibc-2.3.5.tar.bz2 binutils-2.15.tar.bz2 linux-libc-headers-2.6.12.0.tar.bz2 这些包的版本由 gcc-3.4.4-glibc-2.3.5.dat文件的内容决定,我们可以自己修改,但是建议使用默认的,否则在生成工具链的时候会出错,如果非要修改那么可以参考
这个表。
对于arm-linux-gcc-3.4.4-glibc-2.3.5这个工具链可以做如下修改:
gcc-3.4.4-glibc-2.3.5.dat原有内容:
BINUTILS_DIR=binutils-2.15
GCC_DIR=gcc-3.4.4
GLIBC_DIR=glibc-2.3.5
LINUX_DIR=linux-2.6.8
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.5
可以修改为:
BINUTILS_DIR=binutils-2.16
GCC_DIR=gcc-3.4.4
GLIBC_DIR=glibc-2.3.5
LINUX_DIR=linux-2.6.14.1
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.5
GDB_DIR=gdb-6.4
----------------
通过以上修改以后,可以执行
./demo-arm.sh
那么就会在/opt/workspace/toolchains/gcc-3.4.4-glibc-2.3.5/目下下生成arm-unknown-linux-gnu的工具链。工具链我们可以直接使用,也可以集成到scratchbox中使用

--------------------------------

Arm9的交叉编译工具

阅读(1364) | 评论(0) | 转发(0) |
0

上一篇:Android底层启动过程

下一篇:framebuffer

给主人留下些什么吧!~~