Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1347354
  • 博文数量: 206
  • 博客积分: 10571
  • 博客等级: 上将
  • 技术积分: 2610
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-30 11:50
文章分类
文章存档

2014年(1)

2013年(4)

2012年(18)

2010年(14)

2009年(31)

2008年(3)

2007年(135)

分类: LINUX

2007-04-30 14:15:51

一步一步的制作 arm-linux 交叉编译环境
 

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

编译环境 redhat 7.2
8.0
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

glibc-linuxthreads-2.2.4.tar.gz

linux-2.4.21.tar.gz

patch-2.4.21-rmk1.gz # linux kernel patch for arm


我们在 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
MakefileARCH := $(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
选择


网上有的文章用的是
:
$ 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:



阅读(666) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~