| 论坛注册| 加入收藏 | 设为首页| RSS
Google
您当前的位置:首页 > Linux频道 > Linux开发区 > 内核研究

一步步制作 Arm-Linux交叉编译环境

时间:2007-05-08 10:19:48  来源:Linux联盟收集整理  作者:

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

编译环境 redhat 7.2 或 8.0 4aXLinux联盟

binutils-2.14.tar.gz ftp://ftp.gnu.org/gnu/binutils/binutils-2.14.tar.gz 4aXLinux联盟

gcc-core-2.95.3.tar.gz ftp://ftp.gnu.org/gnu/gcc/gcc-2.95.3/gcc-core-2.95.3.tar.gz 4aXLinux联盟

gcc-g++2.95.3.tar.gz ftp://ftp.gnu.org/gnu/gcc/gcc-2.95.3/gcc-g++-2.95.3.tar.gz 4aXLinux联盟

glibc-2.2.4.tar.gz ftp://ftp.gnu.org/gnu/glibc/glibc-2.2.4.tar.gz 4aXLinux联盟

glibc-linuxthreads-2.2.4.tar.gz ftp://ftp.gnu.org/gnu/glibc/glibc-linuxthreads-2.2.4.tar.gz 4aXLinux联盟

linux-2.4.21.tar.gz ftp://ftp.kernle.org/pub/linux/kernel/v2.4/linux-2.4.21.tar.gz 4aXLinux联盟

patch-2.4.21-rmk1.gz # linux kernel patch for arm ftp://ftp.arm.linux.org.uk/pub/linux/arm/kernel/v2.4/patch-2.4.21-rmk1.gz 4aXLinux联盟

我们在 bash 下工作,先设定一些变量: 4aXLinux联盟

$ export VBINUTILS=2.14 4aXLinux联盟

$ export VGCC=2.95.3 4aXLinux联盟

$ export VGLIBC=2.2.4 4aXLinux联盟

$ export VLINUX=2.4.21 4aXLinux联盟

$ export VLINUX_PATCH=rmk1 4aXLinux联盟

$ 4aXLinux联盟

$ export PREFIX=/armtools 4aXLinux联盟

$ export TARGET=arm-linux 4aXLinux联盟

你可以把它们加到 .bashrc 中。如果你这么做了,你需要 logout 再 login 才能生效。 4aXLinux联盟

否则在 bash 的命令行上输入它们并立即生效,但你 logout 再 login 时它就无效了。 4aXLinux联盟

我们的工作路径是: 4aXLinux联盟

...../ ----- ~ -- tars -------- SourceDir 4aXLinux联盟

............|................|---- BuildDir 4aXLinux联盟

............|--- armtools 4aXLinux联盟

$ cd ~ 4aXLinux联盟

$ mkdir -p tars/SourceDir 4aXLinux联盟

$ mkdir tars/BuildDir 4aXLinux联盟

$ mkdir arm_tools 4aXLinux联盟

$ su 4aXLinux联盟

# mv arm_tools $PREFIX 4aXLinux联盟

# exit 4aXLinux联盟

$ 4aXLinux联盟

tars --------------- 在这里放我们的下载来的 .tar.gz 文件 4aXLinux联盟

SourceDir ------ 这个临时目录放我们解压缩后的源文件 4aXLinux联盟

BuildDir --------- 我们在这里编译 4aXLinux联盟

armtools -------- 把arm-linux 交叉编译环境的安装在这里 4aXLinux联盟

1.安装linux 的头文件 4aXLinux联盟

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

1.1解压缩,打补丁 4aXLinux联盟

$ cd ~/tars/SourceDir 4aXLinux联盟

$ tar -zxf ../linux-$VLINUX.tar.gz 4aXLinux联盟

$ cd linux 4aXLinux联盟

$ zcat ../../patch- $VLINUX-$VLINUX_PATCH.gz | patch -p1 4aXLinux联盟

1.2清理一下 4aXLinux联盟

$ make mrproper 4aXLinux联盟

1.3修改 Makefile 4aXLinux联盟

将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。修改后象这样: 4aXLinux联盟

ARCH=arm 4aXLinux联盟

# ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/) 4aXLinux联盟

如果你的系统里的 sed 程序支持用 '\' 续行(通常都支持),你可以用这个 script 去修改 Makefile 4aXLinux联盟

#!/bin/sh 4aXLinux联盟

mv Makefile Makefile.orig 4aXLinux联盟

sed 's/ARCH := $(shell uname -m/ARCH=arm\ 4aXLinux联盟

# ARCH := $(shell uname -m/' < Makefile.orig > Makefile 4aXLinux联盟

#end of script 4aXLinux联盟

注意: 4aXLinux联盟

这个 script 里的 # ARCH := 是上一行的续行,不是 shell 里的注释,它也是要输入的。 4aXLinux联盟

如果你从浏览器(IE, netscape, etc)上 copy-paste 这个 script 到你的 bash console,它很有可能不工作; 4aXLinux联盟

但你在 bash console 里手工输入就可以工作。 4aXLinux联盟

因为有时 copy 过来后,是 'ARCH=arm\r\n',而能工作的是 'ARCH=arm\n'。 4aXLinux联盟

1.4建立连接 4aXLinux联盟

1.4.1如果是LART板子 4aXLinux联盟

$ make lart_config 4aXLinux联盟

$ yes "" | make oldconfig 4aXLinux联盟

$ make include/linux/version.h 4aXLinux联盟

或: 4aXLinux联盟

$ make lart_config 4aXLinux联盟

$ make menuconfig 选择 4aXLinux联盟

网上有的文章用的是: 4aXLinux联盟

$ make symlinks include/linux/version.h 4aXLinux联盟

那是不完全的。make symlinks 的作用相当于: 4aXLinux联盟

$ cd include/asm-arm 4aXLinux联盟

$ rm -f arch proc 4aXLinux联盟

$ ln -s arch-sa1100 arch 4aXLinux联盟

$ ln -s proc-armv proc 4aXLinux联盟

$ cd ../../ 4aXLinux联盟

它并没有产生一个很重要的文件 include/linux/autoconf.h。 4aXLinux联盟

而 yes "" | make oldconfig 不仅是 make symlinks, 4aXLinux联盟

还产生了 include/linux/autoconf.h。但它也没有产生 4aXLinux联盟

include/linux/version.h。 4aXLinux联盟

1.4.2如果是clps711x的CPU 4aXLinux联盟

连接应该为: 4aXLinux联盟

$ cd include/asm-arm 4aXLinux联盟

$ rm -f arch proc 4aXLinux联盟

$ ln -s arch-clps711x arch 4aXLinux联盟

$ ln -s proc-armv proc 4aXLinux联盟

$ cd ../../ 4aXLinux联盟

为你自己的系统定制: 4aXLinux联盟

$ make menuconfig 4aXLinux联盟

在这里你只需要选你使用的 CPU 或选则有你使用的 CPU 的板子即可, 4aXLinux联盟

当然进行更详细的配置更好。 4aXLinux联盟

注: 4aXLinux联盟

include/asm-arm/proc-armo 是26位ARM 4aXLinux联盟

include/asm-arm/proc-armv 是32位ARM 4aXLinux联盟

注:背景知识 4aXLinux联盟

在ARM1中实现26位地址空间,但没有被商用。 4aXLinux联盟

在ARM2,2a 中还有26位地址空间,现在已经废弃。 4aXLinux联盟

在ARM3中扩展到32位地址空间,但是还反向兼容26位。 4aXLinux联盟

在ARM4中是32位地址空间,停止兼容26位地址空间。在 T 系列中加入 Thumb 指令。 4aXLinux联盟

在ARM5中是32位地址空间,在所有系列中均支持 16 位的 Thumb 指令。 4aXLinux联盟

1.5拷贝头文件 4aXLinux联盟

$ mkdir -p $PREFIX/$TARGET/include 4aXLinux联盟

$ cp -dR include/linux $PREFIX/$TARGET/include 4aXLinux联盟

$ cp -dR include/asm-arm $PREFIX/$TARGET/include/asm 4aXLinux联盟

1.6为 gcc 建立一个 linux kernel 头文件的连接 4aXLinux联盟

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

$ cd $PREFIX/$TARGET 4aXLinux联盟

$ ln -s include sys-include 4aXLinux联盟

2编译安装binutils 4aXLinux联盟

这里用不到前面准备的 linux 头文件 4aXLinux联盟

2.1解压缩 4aXLinux联盟

$ cd ~/tars/SourceDir 4aXLinux联盟

$ tar -zxf ../binutils-$VBINUTILS.tar.gz 4aXLinux联盟

2.2编译 4aXLinux联盟

$ cd ~/tars/BuildDir 4aXLinux联盟

$ mkdir binutils 4aXLinux联盟

$ cd binutils 4aXLinux联盟

$ ../../SourceDir/binutils-$VBINUTILS/configure \ 4aXLinux联盟

--target=$TARGET \ 4aXLinux联盟

--prefix=$PREFIX 4aXLinux联盟

$ make all install 4aXLinux联盟

2.3输出 binutils 的路径到环境变量中 4aXLinux联盟

你可以把它加到 .bashrc 中。如果你这么做了,你需要 logout 再 login 才能生效。 4aXLinux联盟

否则在 bash 的命令行上输入它并立即生效,但你 logout 再 login 时它就无效了。 4aXLinux联盟

export PATH=$PREFIX/bin:$PATH 4aXLinux联盟

3.编译安装gcc 的c 编译器 4aXLinux联盟

3.1解压缩 4aXLinux联盟

$ cd ~/tars/SourceDir 4aXLinux联盟

$ tar -zxf ../gcc-core-$VGCC.tar.gz 4aXLinux联盟

注意:为什么不用 all-in-one 的 gcc-$VGCC.tar.gz 呢? 4aXLinux联盟

all-in-one 的 gcc 包里面有 chill, fortran, java 等语言的编译器,虽然在下面 configure 时指定 -enable-languages=c,但编译时还是把所有的都编译一便,这不是我们需要的,而且它也总会有错误。因此我们只编译 C 语言的编译器。后面第二次编译的时候也是这个问题,我们只编译 C 和 C++ 的编译器。 4aXLinux联盟

3.2修改 gcc 的 t-linux 文件 4aXLinux联盟

在 t-linux 文件中的 TARGET_LIBGCC2_CFLAGS 上加上 __gthr_posix_h 和 inhibit_libc 4aXLinux联盟

$ cd gcc-$VGCC/gcc/config/arm 4aXLinux联盟

$ mv t-linux t-linux-orig 4aXLinux联盟

$ sed 's/TARGET_LIBGCC2_CFLAGS =/TARGET_LIBGCC2_CFLAGS = -D__gthr_posix_h -Dinhibit_libc/' < t-linux-orig > t-linux-core 4aXLinux联盟

$ cp ./t-linux-core ./t-linux 4aXLinux联盟

3.4编译 4aXLinux联盟

$ cd ~/tars/BuildDir 4aXLinux联盟

$ mkdir gcc-core 4aXLinux联盟

$ cd gcc-core 4aXLinux联盟

$ ../../SourceDir/gcc-$VGCC/configure \ 4aXLinux联盟

--target=$TARGET \ 4aXLinux联盟

--prefix=$PREFIX \ 4aXLinux联盟

--enable-languages=c \ 4aXLinux联盟

--disable-shared \ 4aXLinux联盟

--disable-threads 4aXLinux联盟

$ make all install 4aXLinux联盟

4.编译安装 glibc 4aXLinux联盟

4.1解压缩 4aXLinux联盟

$ cd ~/tars/SourceDir 4aXLinux联盟

$ tar -zxf ../glibc-$VGLIBC.tar.gz 4aXLinux联盟

$ cd glibc-$VGLIBC 4aXLinux联盟

$ tar -zxf ../../glibc-linuxthreads-$VGLIBC.tar.gz 4aXLinux联盟

4.2编译 4aXLinux联盟

$ cd ~/tars/BuildDir 4aXLinux联盟

$ mkdir glibc 4aXLinux联盟

$ cd glibc 4aXLinux联盟

$ CC=$TARGET-gcc AR=$TARGET-ar RANLIB=$TARGET-ranlib \ 4aXLinux联盟

../../SourceDir/glibc-$VGLIBC/configure \ 4aXLinux联盟

$TARGET \ 4aXLinux联盟

--prefix=$PREFIX/$TARGET \ 4aXLinux联盟

--enable-add-ons 4aXLinux联盟

$ make all install 4aXLinux联盟

5.编译安装gcc 的c, c++ 编译器 4aXLinux联盟

5.1恢复t-linux 文件 4aXLinux联盟

$ cd ~/tars/SourceDir/gcc-$VGCC/gcc/config/arm/ 4aXLinux联盟

$ cp t-linux-orig t-linux 4aXLinux联盟

5.2解压缩 c++ 编译器 4aXLinux联盟

$ cd ~/tars/SourceDir/ 4aXLinux联盟

$ tar -zxf ../gcc-g++-$VGCC.tar.gz 4aXLinux联盟

$ 4aXLinux联盟

$ cd ~/tars/BuildDir 4aXLinux联盟

$ mkdir gcc 4aXLinux联盟

$ cd gcc 4aXLinux联盟

5.3编译 4aXLinux联盟

$ ../../SourceDir/gcc-$VGCC/configure \ 4aXLinux联盟

--target=$TARGET \ 4aXLinux联盟

--prefix=$PREFIX \ 4aXLinux联盟

--enable-languages=c,c++ \ 4aXLinux联盟

--with-included-gettext 4aXLinux联盟

$ make all 4aXLinux联盟

$ make install 4aXLinux联盟

注: 4aXLinux联盟

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

$ tar -jxf filename.tar.bz2 4aXLinux联盟

$ tar -Ixf filename.tar.bz2 4aXLinux联盟

$ bzip2 -dc filename.tar.bz2 | tar xf - 4aXLinux联盟

如果你是第一次制作 arm-linux 交叉编译环境,强烈建议你用本文所使用的各个程序的版本。如果用其它版本,按照本文的方法可能会在编译的时候出问题,因为我没有时间去测试各个版本的组合。这里是源程序: crossarm.sh,它使用的是: 4aXLinux联盟

linux-2.4.21.tar.bz2 4aXLinux联盟

patch-2.4.21.bz2 4aXLinux联盟

binutils-2.14.tar.gz 4aXLinux联盟

gcc-core-2.95.3.tar.gz 4aXLinux联盟

gcc-g++-2.95.3.tar.gz 4aXLinux联盟

glibc-2.2.4.tar.gz 4aXLinux联盟

生成的 toolchain 大于 150 兆,用如下方法压缩: 4aXLinux联盟

$ cd ~ 4aXLinux联盟

$ tar -cf armtools.tar /armtools 4aXLinux联盟

$ bzip2 -z armtools.tar 4aXLinux联盟

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

Credit: 4aXLinux联盟

http://www.armlinux.org/docs/toolchain/toolchHOWTO/x183.html 4aXLinux联盟

http://www.objsw.com/CrossGCC/FAQ-4.html 4aXLinux联盟

http://www.bluewind.it/gnuarm.htm 4aXLinux联盟

http://penguinppc.org/usr/embedded/howto/PowerPC-Embedded-HOWTO-12.html 4aXLinux联盟

来顶一下
近回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
相关文章
    无相关信息
栏目更新
栏目热门