搜索产品 minitos开源嵌入式操作系统 minitos Windows minitos Menu
首 页 产品展厅 精品文章 嵌入式资讯 下载中心 论坛 嵌入式城市 技术应用
 收藏社区
 免费注册
 用户登陆
 帮助中心
社区首页 业界新闻 精品文章 下载中心 minitos2站 在线学习 论坛 嵌入式提问交流学习 供求信息 留言 minitos操作系统 测试
今天是:2010年9月10日 星期五   您现在位于: miniTOS生活社区 →  一步一步的制作 arm-linux 交叉编译环境
谷歌搜本站效率更高
一步一步的制作 arm-linux 交叉编译环境
2005年5月24日  作者:  发布人:专业嵌入式网站      本文已被浏览 1577 次
一步一步的制作 arm-linux 交叉编译环境 
Gavin Li http://embedded.homeunix.org Sunday, June 08, 2003 

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


我们使用以下版本的文件为例子建立 arm-linux 交叉编译环境: 

编译环境 redhat 7.2 或 8.0 
binutils-2.14.tar.gz&nbsftp://ftp.gnu.org/gnu/binutils/binutils-2.14.tar.gz 
gcc-core-2.95.3.tar.gz&nbsftp://ftp.gnu.org/gnu/gcc/gcc-2.95.3/gcc-core-2.95.3.tar.gz 
gcc-g++2.95.3.tar.gz&nbsftp://ftp.gnu.org/gnu/gcc/gcc-2.95.3/gcc-g++-2.95.3.tar.gz 
glibc-2.2.4.tar.gz&nbsftp://ftp.gnu.org/gnu/glibc/glibc-2.2.4.tar.gz 
glibc-linuxthreads-2.2.4.tar.gz&nbsftp://ftp.gnu.org/gnu/glibc/glibc-linuxthreads-2.2.4.tar.gz 
linux-2.4.21.tar.gz&nbsftp://ftp.kernle.org/pub/linux/kernel/v2.4/linux-2.4.21.tar.gz 
patch-2.4.21-rmk1.gz # linux kernel patch for arm&nbsftp://ftp.arm.linux.org.uk/pub/linux/arm/kernel/v2.4/patch-2.4.21-rmk1.gz 

我们在 bash 下工作,先设定一些变量: 
$ export VBINUTILS=2.14 
$ export VGCC=2.95.3 
$ export VGLIBC=2.2.4 
$ export VLINUX=2.4.21 
$ export VLINUX_PATCH=rmk1 

$ export PREFIX=/armtools 
$ export TARGET=arm-linux 


你可以把它们加到 .bashrc 中。如果你这么做了,你需要 logout 再 login 才能生效。 
否则在 bash 的命令行上输入它们并立即生效,但你 logout 再 login 时它就无效了。 

我们的工作路径是: 

...../ ----- ~ -- tars -------- SourceDir 
............|................|---- BuildDir 
............|--- armtools 


$ cd ~ 
$ mkdir -p tars/SourceDir 
$ mkdir tars/BuildDir 
$ mkdir arm_tools 
$ su 
# mv arm_tools $PREFIX 
# exit 



tars --------------- 在这里放我们的下载来的 .tar.gz 文件 
SourceDir ------ 这个临时目录放我们解压缩后的源文件 
BuildDir --------- 我们在这里编译 
armtools -------- 把arm-linux 交叉编译环境的安装在这里 


1.安装linux 的头文件 

当你为不同类型的ARM编译gcc,或编译不同版本的kernel,或交叉编译gcc 时都需要一套不同的linux头文件。 


1.1解压缩,打补丁 
$ cd ~/tars/SourceDir 
$ tar -zxf ../linux-$VLINUX.tar.gz 
$ cd linux 
$ zcat ../../patch- $VLINUX-$VLINUX_PATCH.gz | patch -p1 

1.2清理一下 
$ make mrproper 

1.3修改 Makefile 
将Makefile中ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/) 这一行注释掉,并加一行 ARCH=arm。修改后象这样: 
ARCH=arm 
# ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/) 


如果你的系统里的 sed 程序支持用 '\' 续行(通常都支持),你可以用这个 script 去修改 Makefile 
#!/bin/sh 
mv Makefile Makefile.orig 
sed 's/ARCH := $(shell uname -m/ARCH=arm\ 
# ARCH := $(shell uname -m/' < Makefile.orig > Makefile 
#end of script 

注意: 
这个 script 里的 # ARCH := 是上一行的续行,不是 shell 里的注释,它也是要输入的。 
如果你从浏览器(IE, netscape, etc)上 copy-paste 这个 script 到你的 bash console,它很有可能不工作; 
但你在 bash console 里手工输入就可以工作。 
因为有时 copy 过来后,是 'ARCH=arm\r\n',而能工作的是 'ARCH=arm\n'。 


1.4建立连接 
1.4.1如果是LART板子 
$ make lart_config 
$ yes "" | make oldconfig 
$ make include/linux/version.h 
或: 
$ make lart_config 
$ make menuconfig 选择 <Exit> <Yes> 

网上有的文章用的是: 
$ make symlinks include/linux/version.h 
那是不完全的。make symlinks 的作用相当于: 
$ cd include/asm-arm 
$ rm -f arch proc 
$ ln -s arch-sa1100 arch 
$ ln -s proc-armv proc 
$ cd ../../ 
它并没有产生一个很重要的文件 include/linux/autoconf.h。 
而 yes "" | make oldconfig 不仅是 make symlinks, 
还产生了 include/linux/autoconf.h。但它也没有产生 
include/linux/version.h。 

1.4.2如果是clps711x的CPU 
连接应该为: 
$ cd include/asm-arm 
$ rm -f arch proc 
$ ln -s arch-clps711x arch 
$ ln -s proc-armv proc 
$ cd ../../ 

为你自己的系统定制: 
$ make menuconfig 
在这里你只需要选你使用的 CPU 或选则有你使用的 CPU 的板子即可, 
当然进行更详细的配置更好。 

注: 
include/asm-arm/proc-armo 是26位ARM 

include/asm-arm/proc-armv 是32位ARM 


注:背景知识 
在ARM1中实现26位地址空间,但没有被商用。 
在ARM2,2a 中还有26位地址空间,现在已经废弃。 
在ARM3中扩展到32位地址空间,但是还反向兼容26位。 
在ARM4中是32位地址空间,停止兼容26位地址空间。在 T 系列中加入 Thumb 指令。 
在ARM5中是32位地址空间,在所有系列中均支持 16 位的 Thumb 指令。 


1.5拷贝头文件 
$ mkdir -p $PREFIX/$TARGET/include 
$ cp -dR include/linux $PREFIX/$TARGET/include 
$ cp -dR include/asm-arm $PREFIX/$TARGET/include/asm 

1.6为 gcc 建立一个 linux kernel 头文件的连接 
编译gcc时,它需要 linux kernel 的头文件,你可以用 --with-headers=$PREFIX/$TARGET/include 来指定头文件的位置,gcc 把它拷贝到 $PREFIX/$TARGET/sys-include。我们可以建立个 sys-include 连接,就不用 --with-headers 了。 
$ cd $PREFIX/$TARGET 
$ ln -s include sys-include 

2编译安装binutils 

这里用不到前面准备的 linux 头文件 


2.1解压缩 
$ cd ~/tars/SourceDir 
$ tar -zxf ../binutils-$VBINUTILS.tar.gz 

2.2编译 
$ cd ~/tars/BuildDir 
$ mkdir binutils 
$ cd binutils 
$ ../../SourceDir/binutils-$VBINUTILS/configure \ 
--target=$TARGET \ 
--prefix=$PREFIX 
$ make all install 

2.3输出 binutils 的路径到环境变量中 
你可以把它加到 .bashrc 中。如果你这么做了,你需要 logout 再 login 才能生效。 
否则在 bash 的命令行上输入它并立即生效,但你 logout 再 login 时它就无效了。 
export PATH=$PREFIX/bin:$PATH 

3.编译安装gcc 的c 编译器 
3.1解压缩 
$ cd ~/tars/SourceDir 
$ tar -zxf ../gcc-core-$VGCC.tar.gz 

注意:为什么不用 all-in-one 的 gcc-$VGCC.tar.gz 呢? 
all-in-one 的 gcc 包里面有 chill, fortran, java 等语言的编译器,虽然在下面 configure 时指定 -enable-languages=c,但编译时还是把所有的都编译一便,这不是我们需要的,而且它也总会有错误。因此我们只编译 C 语言的编译器。后面第二次编译的时候也是这个问题,我们只编译 C 和 C++ 的编译器。 


3.2修改 gcc 的 t-linux 文件 
在 t-linux 文件中的 TARGET_LIBGCC2_CFLAGS 上加上 __gthr_posix_h 和 inhibit_libc 

$ cd gcc-$VGCC/gcc/config/arm 
$ mv t-linux t-linux-orig 
$ sed 's/TARGET_LIBGCC2_CFLAGS =/TARGET_LIBGCC2_CFLAGS = -D__gthr_posix_h -Dinhibit_libc/' < t-linux-orig > t-linux-core 
$ cp ./t-linux-core ./t-linux 

3.4编译 
$ cd ~/tars/BuildDir 
$ mkdir gcc-core 
$ cd gcc-core 
$ ../../SourceDir/gcc-$VGCC/configure \ 
--target=$TARGET \ 
--prefix=$PREFIX \ 
--enable-languages=c \ 
--disable-shared \ 
--disable-threads 
$ make all install 

4.编译安装 glibc 
4.1解压缩 
$ cd ~/tars/SourceDir 
$ tar -zxf ../glibc-$VGLIBC.tar.gz 
$ cd glibc-$VGLIBC 
$ tar -zxf ../../glibc-linuxthreads-$VGLIBC.tar.gz 

4.2编译 
$ cd ~/tars/BuildDir 
$ mkdir glibc 
$ cd glibc 
$ CC=$TARGET-gcc AR=$TARGET-ar RANLIB=$TARGET-ranlib \ 
../../SourceDir/glibc-$VGLIBC/configure \ 
$TARGET \ 
--prefix=$PREFIX/$TARGET \ 
--enable-add-ons 
$ make all install 

5.编译安装gcc 的c, c++ 编译器 
5.1恢复t-linux 文件 
$ cd ~/tars/SourceDir/gcc-$VGCC/gcc/config/arm/ 
$ cp t-linux-orig t-linux 

5.2解压缩 c++ 编译器 
$ cd ~/tars/SourceDir/ 
$ tar -zxf ../gcc-g++-$VGCC.tar.gz 

$ cd ~/tars/BuildDir 
$ mkdir gcc 
$ cd gcc 

5.3编译 
$ ../../SourceDir/gcc-$VGCC/configure \ 
--target=$TARGET \ 
--prefix=$PREFIX \ 
--enable-languages=c,c++ \ 
--with-included-gettext 
$ make all 
$ make install 


注: 
如果你下载的是 filename.tar.bz2,你可以用如下命令之一解压缩,第三种方式在任何系统中都好使。 

$ tar -jxf filename.tar.bz2 
$ tar -Ixf filename.tar.bz2 
$ bzip2 -dc filename.tar.bz2 | tar xf - 


如果你是第一次制作 arm-linux 交叉编译环境,强烈建议你用本文所使用的各个程序的版本。如果用其它版本,按照本文的方法可能会在编译的时候出问题,因为我没有时间去测试各个版本的组合。这里是源程序: crossarm.sh,它使用的是: 
linux-2.4.21.tar.bz2 
patch-2.4.21.bz2 
binutils-2.14.tar.gz 
gcc-core-2.95.3.tar.gz 
gcc-g++-2.95.3.tar.gz 
glibc-2.2.4.tar.gz 
生成的 toolchain 大于 150 兆,用如下方法压缩: 
$ cd ~ 
$ tar -cf armtools.tar /armtools 
$ bzip2 -z armtools.tar 

压缩后生成的 armtools.tar.bz2 大概有 30 几兆。 

Credit: 
http://www.armlinux.org/docs/toolchain/toolchHOWTO/x183.html 
http://www.objsw.com/CrossGCC/FAQ-4.html 
http://www.bluewind.it/gnuarm.htm 
http://penguinppc.org/usr/embedded/howto/PowerPC-Embedded-HOWTO-12.html 

-------------------------------------------------------------------------------- 
Copyright © Gavin Li 2001~2003 
 发布人:minitos
 [ → 我要发表文章 ]
上篇文章:自己动手打造嵌入式Linux软硬件开发环境
下篇文章:将Linux代码移植到Windows的简单方法
→ 主题所属分类:  精品文章 → 技术文章 → 『关闭窗口』
 热门文章
 
 skyeye安装运行的详细方法--step by step (20796)
 cygwin下安装arm-elf-gcc一种简便方法 (5939)
 充电器设计及镍氢电池充电方法2 (3394)
 镍氢电池充电方法及充电器(二) (2546)
 Instruction Set: Analysis of SH66x... (2309)
 FAT16文件系统格式详细说明 (2134)
 充电器设计及镍氢电池充电方法1 (1932)
 使用GDB-gnu debug (1690)
 单片机数码管显示驱动设计 (1681)
 一步一步的制作 arm-linux 交叉编译环境 (1578)
 最近更新
 
 QTE 4安装方法 (6月3日)
 真是好文,fc6安装qte,共享 (6月3日)
 超低价部分原装IGBT销售 (6月2日)
 Protel99SE快捷键大全 (6月2日)
 Protel 99 SE的功能特性 (6月2日)
 Protel 99 SE的系统组成 (6月2日)
 设计PCB时抗静电放电(ESD)的方法 (6月2日)
 模拟集成电路 (6月2日)
 数字集成电路 (6月2日)
 语音集成电路 (6月2日)
 文章搜索
 
搜索选项:            
  → 评论内容 (点击查看)
姓名:thjemyu  E-mail:siqsua@ydbuvy.com  发表时间:2010年2月18日 12时37分
评论内容:pF4PM4  <a href="http://ttgkbvqxhnqr.com/">ttgkbvqxhnqr</a>, [url=http://reelamrbppfl.com/]reelamrbppfl[/url], [link=http://xmgqoglxnytt.com/]xmgqoglxnytt[/link], http://yammuwvqbhks.com/
姓名:ipzxodewctz  E-mail:cpnubp@tlttjp.com  发表时间:2010年1月4日 23时58分
评论内容:O1tqt1  <a href="http://xavcyeuyalet.com/">xavcyeuyalet</a>, [url=http://orclflfctvtz.com/]orclflfctvtz[/url], [link=http://moxhjimkoiid.com/]moxhjimkoiid[/link], http://fkpdpbljfbed.com/
姓名:xcjnopjdyb  E-mail:nfgrar@ziptah.com  发表时间:2009年11月7日 21时44分
评论内容:QZLmnx  <a href="http://ijvuqjbxeayj.com/">ijvuqjbxeayj</a>, [url=http://dglvqglywxkq.com/]dglvqglywxkq[/url], [link=http://lqprhbxuqnlk.com/]lqprhbxuqnlk[/link], http://ufutnfwxfnxf.com/
  → 发表我的评论
您的姓名:  您的E-mail:

评论内容:
发表评论:  
娱乐中心 ┋ 关于本站 ┋ 站内短信 ┋ 广告服务 ┋ 友情链接 ┋ 与我在线 ┋ 版权声明  TOP
本站总访问量: 197305 人次 ┋ 最高峰 589 人在线 ┋ 当前有 11 人在线
专业嵌入式网站 [完整型] ┋页面执行时间:156.250 毫秒
Copyright © 2002-2005 minitos.com All Rights Reserved
友情链接: embed嵌入开发网 ┋ 嵌入式提问网 ┋ 嵌入式资料网 ┋ 网络站 ┋ 论坛 ┋