在Fedora 下建立 ARM-Linux 交叉编译环境
2013-04-19 09:48
519 查看
作者:Tekkaman Ninja
转自:http://blog.chinaunix.net/uid-20543672-id-94268.html
这几天忙着在Fedora 7下建立ARM-Linux的交叉编译环境。一开始参考了《构建嵌入式Linux系统》,这是一本很经典的书。上面介绍了建立ARM-Linux的交叉编译环境的许多知识,建立的原则和方法。我一开始想按照上面的一般方法,建立一个自己的、最新的交叉编译环境。但是 ,试了才知道这个过程是一个繁琐、耗时的工作。对于没有编译原理知识的我来说,更是耗时又毫无意义。引用《嵌入式设计及Linux驱动程序开发指南——基于ARM9处理器(第2版)》的原话:“在这项工作上浪费时间似乎没有任何意义,我也是这么认为的,”。由于在公司做事,时间不多,最后,我利用crosstool-0.43,自动完成了这项工作。在是否有必要自己建立交叉编译环境的问题上,我建议:如果你是一个学生,建议你认真学习编译原理、Linux和GNU的编译器原理,再一步一步的自己建立交叉编译环境(学生比较有时间,少泡MM,少玩游戏,时间就挤出来了。好好学习,以后MM来泡你,别人玩你编的游戏。
)。如果你是程序员(不是交叉编译器的开发者),建议不要在这上面浪费时间了,赚钱要紧,把这个作为业余爱好吧!
这次建立交叉编译环境我主要参考的资料是:
1、《构建嵌入式Linux系统》
2、《嵌入式设计及Linux驱动程序开发指南——基于ARM9处理器(第2版)》
3、《 ARM Linux 交叉编译 工具链 制作攻略》
4、《 AT91RM9200引导程序的建立--------建立交叉编译工具链》
Host CPU:i686
RAM: 768MB
OS: Fedora 7
TARGET CPU :ARM9TDMI
OS : Linux-2.6.22.2/2.6.15.4
我在Fedora7下快速、成功地建立ARM-Linux交叉编译环境,是看了《嵌入式设计及Linux驱动程序开发指南——基于ARM9处理器(第2版)》中关于crosstool的介绍。
crosstool是由美国人Dan Kegel(毕业于加(利福尼亚)州工学院)开发的一套可以自动编译不同匹配版本gcc和glibc,并作测试的脚本程序。写这篇文章时的最新版本是0.43。
下载地址http://kegel.com/crosstool/crosstool-0.43.tar.gz
在http://kegel.com/crosstool/crosstool-0.43/buildlogs/可以看到各种CPU和GCC+Glibc版本那些已经编译成功,那些部分成功,那些彻底失败。如果你不是编译器开发者,就按着上面做吧。
你也可以到http://kegel.com/crosstool/#download看看是否有更新的版本。
第一步:保证你装Fedora7时,安装了需要的软件开发工具。在《
ARM Linux 交叉编译 工具链 制作攻略》中说:“0、制作之前确保你的机子上有如下几个工具:bison、flex、build-essential。”
我的机子上有bison和flex,至于build-essential是包含一个在建立deb包过程中起关键作用的包的信息列表,Fedora下并不需要。
第二步:下载crosstool,并解压到你的工作目录。
第三步:察看crosstool文件夹中,可以看到目录下有很多.sh脚本和.dat配置文件。找到你要交叉编译的CPU所对应的脚本,如我要交叉编译的CPU是S3C2410A,则选用demo-arm9tdmi.sh。以下是其内容和所需的修改:
第三步(可选):根据你所选的工具链的版本号,打开相应的.dat文件,察看所需的源码包,并下载到
${TARBALLS_DIR}
目录中。
例如:我在demo-arm9tdmi.sh中选的是eval
`cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest ,那么我就打开arm9tdmi.dat gcc-4.1.0-glibc-2.3.2-tls.dat,其内容如下:
到网上去下载红色标记的.bz2源码包,注意其版本号,下载后存放到${TARBALLS_DIR}目录下。注意:不要解压!
以下是《
[b]ARM Linux 交叉编译 工具链 制作攻略》介绍的可下载源码包的中国镜像站点(我并没都试过):[/b]
这一步可以省略,因为如果运行demo-arm9tdmi.sh 时在${TARBALLS_DIR}目录下没有相应的源码包,会自动下载其.bz2源码包。但是建议事先用下载工具下好,这样更省时间。
根据《构建嵌入式Linux系统》中的介绍,如果为不同的内核编译交叉编译工具,交叉编译工具要根据其内核重新编译过。由于我想使用最新的2.6.22.2 内核,所以在编译完以上配置的工具链后,我将“LINUX_DIR=linux-2.6.15.4 ”改成“LINUX_DIR=linux-2.6.22.2 ”,并下载linux-2.6.22.2.tar.bz2到${TARBALLS_DIR}目录下,重新编译了一次。
最后一步:进入crosstool-0.43目录,输入./demo-arm9tdmi.sh,然后就是泡茶、看书。经过不到3小时的编译(公司的烂电脑所用的时间,配置好的可以更快),就可以在${RESULT_TOP}目录中看到想要的工具链、头文件、库文件等文件了,[b]在[b]${RESULT_TOP}/gcc-4.1.0-glibc-2.3.2/arm-9tdmi-linux-gnu/tmp文件夹中有Hello,world!测试程序[/b][/b]。一般不会失败,我编了2.6.15.4内核和2.6.22.2内核都顺利结束,且移植U-boot1.2.0、Linux2.6.22.2、busybox1.9.0和其他的驱动或应用程序都十分顺利,从没出过错!下载到S3c2410和S3c2440的开发板上(2.6.22.2内核)测试,都没问题。证明编译出的程序绝对可用!
补:在Fedora 8 下建立 ARM-Linux 交叉编译环境
Host CPU:AMD 3000+ (X86-64)
RAM: DDR400 1GB (双通道)
OS: Fedora 8
同样使用crosstool-0.43,因为没有新的版本(截止2008年1月24日),强烈希望Dan
Kegel能出新的版本!
我在http://kegel.com/crosstool/crosstool-0.43/buildlogs/上看到arm9tdmi平台的交叉编译器最新的成功组合为
gcc-4.1.1
cgcc-3.3.6
glibc-2.3.2
binutils-2.16.1
linux-2.6.15.4
hdrs-2.6.12.0
我回来看了看去年我在f7下做gcc-4.1.0还不是最新的,而且现在的内核已经是linux-2.6.24,所以决定重做交叉编译器。
我对demo-arm9tdmi.sh的修改为:
如果要使用GDB调试应用程序的话,记得要在后面加上--gdb,这样Crosstool会一同帮你编译出arm-9tdmi-linux-gnu-gdb、arm-9tdmi-linux-gnu-gdbtui和gdbserver(开发板用的)。省得以后还要单独去编译。
然后修改
然后下载相应的bz2包到
转自:http://blog.chinaunix.net/uid-20543672-id-94268.html
这几天忙着在Fedora 7下建立ARM-Linux的交叉编译环境。一开始参考了《构建嵌入式Linux系统》,这是一本很经典的书。上面介绍了建立ARM-Linux的交叉编译环境的许多知识,建立的原则和方法。我一开始想按照上面的一般方法,建立一个自己的、最新的交叉编译环境。但是 ,试了才知道这个过程是一个繁琐、耗时的工作。对于没有编译原理知识的我来说,更是耗时又毫无意义。引用《嵌入式设计及Linux驱动程序开发指南——基于ARM9处理器(第2版)》的原话:“在这项工作上浪费时间似乎没有任何意义,我也是这么认为的,”。由于在公司做事,时间不多,最后,我利用crosstool-0.43,自动完成了这项工作。在是否有必要自己建立交叉编译环境的问题上,我建议:如果你是一个学生,建议你认真学习编译原理、Linux和GNU的编译器原理,再一步一步的自己建立交叉编译环境(学生比较有时间,少泡MM,少玩游戏,时间就挤出来了。好好学习,以后MM来泡你,别人玩你编的游戏。
)。如果你是程序员(不是交叉编译器的开发者),建议不要在这上面浪费时间了,赚钱要紧,把这个作为业余爱好吧!
这次建立交叉编译环境我主要参考的资料是:
1、《构建嵌入式Linux系统》
2、《嵌入式设计及Linux驱动程序开发指南——基于ARM9处理器(第2版)》
3、《 ARM Linux 交叉编译 工具链 制作攻略》
4、《 AT91RM9200引导程序的建立--------建立交叉编译工具链》
Host CPU:i686
RAM: 768MB
OS: Fedora 7
TARGET CPU :ARM9TDMI
OS : Linux-2.6.22.2/2.6.15.4
我在Fedora7下快速、成功地建立ARM-Linux交叉编译环境,是看了《嵌入式设计及Linux驱动程序开发指南——基于ARM9处理器(第2版)》中关于crosstool的介绍。
crosstool是由美国人Dan Kegel(毕业于加(利福尼亚)州工学院)开发的一套可以自动编译不同匹配版本gcc和glibc,并作测试的脚本程序。写这篇文章时的最新版本是0.43。
下载地址http://kegel.com/crosstool/crosstool-0.43.tar.gz
在http://kegel.com/crosstool/crosstool-0.43/buildlogs/可以看到各种CPU和GCC+Glibc版本那些已经编译成功,那些部分成功,那些彻底失败。如果你不是编译器开发者,就按着上面做吧。
你也可以到http://kegel.com/crosstool/#download看看是否有更新的版本。
第一步:保证你装Fedora7时,安装了需要的软件开发工具。在《
ARM Linux 交叉编译 工具链 制作攻略》中说:“0、制作之前确保你的机子上有如下几个工具:bison、flex、build-essential。”
我的机子上有bison和flex,至于build-essential是包含一个在建立deb包过程中起关键作用的包的信息列表,Fedora下并不需要。
第二步:下载crosstool,并解压到你的工作目录。
tar -xzvf crosstool-0.43.tar.gz cd crosstool-0.43 |
#!/bin/sh # This script has one line for each known working toolchain # for this architecture. Uncomment the one you want. # Generated by generate-demo.pl from buildlogs/all.dats.txt set -ex TARBALLS_DIR=/home/tekkaman/working/source RESULT_TOP=/home/tekkaman/working/crosstool //这两行是需要修改的参数,TARBALLS_DIR是下载的工具源码压缩包的存放目录。 //RESULT_TOP是要生成的工具链的存放目录,一定要改到有写权限的目录,不然无法编译。 //如用root登录进行编译,可能会出错,详情请见后记! //以上是我的修改,他人可以根据实际情况修改。 exportTARBALLS_DIR RESULT_TOP GCC_LANGUAGES="c,c++" export GCC_LANGUAGES # Really, you should do the mkdir before running this, # and chown /opt/crosstool to yourself so you don't need to run as root. mkdir -p $RESULT_TOP #eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.2.5.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.3.2.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.3.2-tls.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.2.5.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.3.2.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.3.2-tls.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.2.5.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.2.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.2-tls.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.5.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.5-tls.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.6-tls.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.2.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.2-tls.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.5.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.5-tls.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.6.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.6-tls.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2.dat` sh all.sh --notest eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest //上面表示要选工具链的版本号!"#"起注释功能!可以选择一行! //这行是默认的工具链的版本号(最新的),我就是用这一行,也可以选别的。 echo Done. |
${TARBALLS_DIR}
目录中。
例如:我在demo-arm9tdmi.sh中选的是eval
`cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest ,那么我就打开arm9tdmi.dat gcc-4.1.0-glibc-2.3.2-tls.dat,其内容如下:
BINUTILS_DIR=binutils-2.16.1 GCC_CORE_DIR=gcc-3.3.6 GCC_DIR=gcc-4.1.0 GLIBC_DIR=glibc-2.3.2 LINUX_DIR=linux-2.6.15.4 LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0 GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2 GDB_DIR=gdb-6.5 GLIBC_EXTRA_CONFIG="$GLIBC_EXTRA_CONFIG --with-tls --with-__thread --enable-kernel=2.4.18" |
以下是《
[b]ARM Linux 交叉编译 工具链 制作攻略》介绍的可下载源码包的中国镜像站点(我并没都试过):[/b]
http://mirrors.shlug.org/ http://www.cn.kernel.org/pub/linux http://www.cn.kernel.org/pub/software ftp://ftp.cn.kernel.org/pub/linux ftp://ftp.cn.kernel.org/pub/software |
根据《构建嵌入式Linux系统》中的介绍,如果为不同的内核编译交叉编译工具,交叉编译工具要根据其内核重新编译过。由于我想使用最新的2.6.22.2 内核,所以在编译完以上配置的工具链后,我将“LINUX_DIR=linux-2.6.15.4 ”改成“LINUX_DIR=linux-2.6.22.2 ”,并下载linux-2.6.22.2.tar.bz2到${TARBALLS_DIR}目录下,重新编译了一次。
最后一步:进入crosstool-0.43目录,输入./demo-arm9tdmi.sh,然后就是泡茶、看书。经过不到3小时的编译(公司的烂电脑所用的时间,配置好的可以更快),就可以在${RESULT_TOP}目录中看到想要的工具链、头文件、库文件等文件了,[b]在[b]${RESULT_TOP}/gcc-4.1.0-glibc-2.3.2/arm-9tdmi-linux-gnu/tmp文件夹中有Hello,world!测试程序[/b][/b]。一般不会失败,我编了2.6.15.4内核和2.6.22.2内核都顺利结束,且移植U-boot1.2.0、Linux2.6.22.2、busybox1.9.0和其他的驱动或应用程序都十分顺利,从没出过错!下载到S3c2410和S3c2440的开发板上(2.6.22.2内核)测试,都没问题。证明编译出的程序绝对可用!
补:在Fedora 8 下建立 ARM-Linux 交叉编译环境
Host CPU:AMD 3000+ (X86-64)
RAM: DDR400 1GB (双通道)
OS: Fedora 8
同样使用crosstool-0.43,因为没有新的版本(截止2008年1月24日),强烈希望Dan
Kegel能出新的版本!
我在http://kegel.com/crosstool/crosstool-0.43/buildlogs/上看到arm9tdmi平台的交叉编译器最新的成功组合为
gcc-4.1.1
cgcc-3.3.6
glibc-2.3.2
binutils-2.16.1
linux-2.6.15.4
hdrs-2.6.12.0
我回来看了看去年我在f7下做gcc-4.1.0还不是最新的,而且现在的内核已经是linux-2.6.24,所以决定重做交叉编译器。
我对demo-arm9tdmi.sh的修改为:
#!/bin/sh # This script has one line for each known working toolchain # for this architecture. Uncomment the one you want. # Generated by generate-demo.pl from buildlogs/all.dats.txt set -ex TARBALLS_DIR=/home/tekkamanninja/embeddedLinux/ARM-Linux_source RESULT_TOP=/home/tekkamanninja/embeddedLinux/crosstool-4.1.1 exportTARBALLS_DIR RESULT_TOP GCC_LANGUAGES="c,c++" export GCC_LANGUAGES # Really, you should do the mkdir before running this, # and chown /opt/crosstool to yourself so you don't need to run as root. mkdir -p $RESULT_TOP #eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.2.5.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.3.2.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.3.2-tls.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.2.5.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.3.2.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.3.2-tls.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.2.5.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.2.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.2-tls.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.5.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.5-tls.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.6-tls.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.2.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.2-tls.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.5.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.5-tls.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.6.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.6-tls.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest eval `cat arm9tdmi.dat gcc-4.1.1-glibc-2.3.2.dat` sh all.sh --notest --gdb echo Done. |
然后修改
gcc-4.1.1-glibc-2.3.2.dat :
BINUTILS_DIR=binutils-2.16.1 GCC_CORE_DIR=gcc-3.3.6 GCC_DIR=gcc-4.1.1 GLIBC_DIR=glibc-2.3.2 LINUX_DIR=linux-2.6.24.2 LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0 GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2 GDB_DIR=gdb-6.5 |
TARBALLS_DIR文件夹,最后进入crosstool-0.43目录,输入./demo-arm9tdmi.sh,最后经过不到一个小时,编译成功!!!!
网友反馈: 1、有位网友按以上的方法做,碰到了如下错误提示:
所以我在这里再次建议:在嵌入式开发时,最好以普通用户登录,这样Host系统会比较安全。《构建嵌入式Linux系统》里也是这样建议的!!! 2、有位网友碰到了如下错误提示:
在shell中输入:
|
相关文章推荐
- 在 Fedora 下建立 ARM-Linux 交叉编译环境
- 在fedora12下用crosstool-ng建立arm-linux交叉编译环境
- 第一步在Fedora 8下用crosstool-ng建立arm-linux交叉编译环境(TQ2440 S3C2440)--->完结,测试通过
- fedora13 arm linux交叉编译环境建立
- 在 Fedora 下建立 ARM-Linux 交叉编译环境
- 在Fedora18下用cross-ng1.9.3建立arm-linux交叉编译环境在s3c6410上使用
- 建立ARM交叉编译环境 (arm-none-linux-gnueabi-gcc with EABI)
- 建立arm-linux-gcc 4.1.1交叉编译环境
- 建立交叉编译环境arm-linux-gcc
- arm-linux交叉编译环境的建立
- ubuntun 下使用QTcreator作为IDE建立arm-linux交叉编译环境
- arm-linux交叉编译环境的建立
- fedora8下的arm交叉编译环境建立完美详介
- Ubuntu9.10建立交叉编译环境arm-linux-gcc-4.3.2
- ubuntu12.04建立交叉编译环境,bin/.arm-none-linux-gnueabi-gcc: not found
- OANET(三):建立arm-linux交叉编译环境
- 建立arm-linux-gcc交叉编译环境
- 建立交叉编译环境arm-linux-gcc-4.…
- Ubuntu 9.10上建立ARM-Linux交叉编译环境
- 在ubuntu8.10 下建立 ARM-Linux 交叉编译环境