一步一步的制作 arm-linux 交叉编译环境
%A Gavin Li Sunday, Jan 27, 2004
%A
%A --------------------------------------------------------------------------------
%A
%A
%A 我们使用以下版本的文件为例子建立 arm-linux 交叉编译环境:
%A
%A 编译环境 redhat 7.2 或 8.0
%A binutils-2.14.tar.gz
%A gcc-core-2.95.3.tar.gz
%A gcc-g++2.95.3.tar.gz
%A glibc-2.2.4.tar.gz
%A glibc-linuxthreads-2.2.4.tar.gz
%A linux-2.4.21.tar.gz
%A patch-2.4.21-rmk1.gz # linux kernel patch for arm
%A
%A 我们在 bash 下工作,先设定一些变量:
%A $ export VBINUTILS=2.14
%A $ export VGCC=2.95.3
%A $ export VGLIBC=2.2.4
%A $ export VLINUX=2.4.21
%A $ export VLINUX_PATCH=rmk1
%A $
%A $ export PREFIX=/armtools
%A $ export TARGET=arm-linux
%A
%A
%A 你可以把它们加到 .bashrc 中。如果你这么做了,你需要 logout 再 login 才能生效。
%A 否则在 bash 的命令行上输入它们并立即生效,但你 logout 再 login 时它就无效了。
%A
%A 我们的工作路径是:
%A
%A / ----- ~ -- tars -------- SourceDir
%A | |---- BuildDir
%A |--- armtools
%A
%A
%A $ cd ~
%A $ mkdir -p tars/SourceDir
%A $ mkdir tars/BuildDir
%A $ mkdir arm_tools
%A $ su
%A # mv arm_tools $PREFIX
%A # exit
%A $
%A
%A
%A tars 在这里放我们的下载来的 .tar.gz 文件
%A SourceDir 这个临时目录放我们解压缩后的源文件
%A BuildDir 我们在这里编译
%A armtools 把arm-linux 交叉编译环境的安装在这里
%A
%A 安装linux 的头文件
%A
%A 当你为不同类型的ARM编译gcc,或编译不同版本的kernel,或交叉编译gcc 时都需要一套不同的linux头文件。
%A
%A
%A 解压缩,打补丁
%A $ cd ~/tars/SourceDir
%A $ tar -zxf ../linux-$VLINUX.tar.gz
%A $ cd linux
%A $ zcat ../../patch-$VLINUX-$VLINUX_PATCH.gz | patch -p1
%A
%A 清理一下
%A $ make mrproper
%A
%A
%A
%A
%A 建立连接
%A 如果是linux kernel 已经支持的板子
%A 查看 linux/arch/arm/def-configs 下面的文件名,例如:lart,at91rm9200dk 等。你可以用 make ARCH=arm that_file_name_config 来产生默认的配置。
%A 例如:
%A make ARCH=arm lart_config
%A make ARCH=arm at91rm9200dk
%A 以 lart 为例:
%A $ make lart_config
%A $ yes "" | make oldconfig
%A $ make include/linux/version.h
%A 或:
%A $ make ARCH=arm lart_config
%A $ make ARCH=arm menuconfig 选择 <Exit> <Yes>
%A
%A 网上有的文章用的是:
%A $ make symlinks include/linux/version.h
%A 那是不完全的。make symlinks 的作用相当于:
%A $ cd include/asm-arm
%A $ rm -f arch proc
%A $ ln -s arch-sa1100 arch
%A $ ln -s proc-armv proc
%A $ cd ../../
%A 它并没有产生一个很重要的文件 include/linux/autoconf.h。
%A 而 yes "" | make oldconfig 不仅是 make symlinks,
%A 还产生了 include/linux/autoconf.h。但它也没有产生
%A include/linux/version.h。
%A
%A 如果是clps711x的CPU
%A 连接应该为:
%A $ cd include/asm-arm
%A $ rm -f arch proc
%A $ ln -s arch-clps711x arch
%A $ ln -s proc-armv proc
%A $ cd ../../
%A
%A 为你自己的系统定制:
%A $ make ARCH=arm menuconfig
%A 在这里你只需要选你使用的 CPU 或选则有你使用的 CPU 的板子即可,
%A 当然进行更详细的配置更好。
%A
%A 注:
%A include/asm-arm/proc-armo 是26位ARM
%A
%A include/asm-arm/proc-armv 是32位ARM
%A
%A
%A 注:背景知识
%A 在ARM1中实现26位地址空间,但没有被商用。
%A 在ARM2,2a 中还有26位地址空间,现在已经废弃。
%A 在ARM3中扩展到32位地址空间,但是还反向兼容26位。
%A 在ARM4中是32位地址空间,停止兼容26位地址空间。在 T 系列中加入 Thumb 指令。
%A 在ARM5中是32位地址空间,在所有系列中均支持 16 位的 Thumb 指令。
%A
%A
%A 拷贝头文件
%A $ mkdir -p $PREFIX/$TARGET/include
%A $ cp -dR include/linux $PREFIX/$TARGET/include
%A $ cp -dR include/asm-arm $PREFIX/$TARGET/include/asm
%A
%A 为 gcc 建立一个 linux kernel 头文件的连接
%A 编译gcc时,它需要 linux kernel 的头文件,你可以用 --with-headers=$PREFIX/$TARGET/include 来指定头文件的位置,gcc 把它拷贝到 $PREFIX/$TARGET/sys-include。我们可以建立个 sys-include 连接,就不用 --with-headers 了。
%A $ cd $PREFIX/$TARGET
%A $ ln -s include sys-include
%A
%A 编译安装binutils
%A
%A 这里用不到前面准备的 linux 头文件
%A
%A
%A 解压缩
%A $ cd ~/tars/SourceDir
%A $ tar -zxf ../binutils-$VBINUTILS.tar.gz
%A
%A 编译
%A $ cd ~/tars/BuildDir
%A $ mkdir binutils
%A $ cd binutils
%A $ ../../SourceDir/binutils-$VBINUTILS/configure \
%A --target=$TARGET \
%A --prefix=$PREFIX
%A $ make all install
%A
%A 输出 binutils 的路径到环境变量中
%A 你可以把它加到 .bashrc 中。如果你这么做了,你需要 logout 再 login 才能生效。
%A 否则在 bash 的命令行上输入它并立即生效,但你 logout 再 login 时它就无效了。
%A export PATH=$PREFIX/bin:$PATH
%A
%A 编译安装gcc 的c 编译器
%A 解压缩
%A $ cd ~/tars/SourceDir
%A $ tar -zxf ../gcc-core-$VGCC.tar.gz
%A
%A 注意:为什么不用 all-in-one 的 gcc-$VGCC.tar.gz 呢?
%A all-in-one 的 gcc 包里面有 chill, fortran, java 等语言的编译器,虽然在下面 configure 时指定 -enable-languages=c,但编译时还是把所有的都编译一便,这不是我们需要的,而且它也总会有错误。因此我们只编译 C 语言的编译器。后面第二次编译的时候也是这个问题,我们只编译 C 和 C++ 的编译器。
%A
%A
%A 修改 gcc 的 t-linux 文件
%A 在 t-linux 文件中的 TARGET_LIBGCC2_CFLAGS 上加上 __gthr_posix_h 和 inhibit_libc
%A
%A $ cd gcc-$VGCC/gcc/config/arm
%A $ mv t-linux t-linux-orig
%A $ sed ‘‘s/TARGET_LIBGCC2_CFLAGS =/TARGET_LIBGCC2_CFLAGS = -D__gthr_posix_h -Dinhibit_libc/‘‘ \
%A < t-linux-orig > t-linux-core
%A $ cp ./t-linux-core ./t-linux
%A
%A 编译
%A $ cd ~/tars/BuildDir
%A $ mkdir gcc-core
%A $ cd gcc-core
%A $ ../../SourceDir/gcc-$VGCC/configure \
%A --target=$TARGET \
%A --prefix=$PREFIX \
%A --enable-languages=c \
%A --disable-shared \
%A --disable-threads
%A $ make all install
%A
%A 编译安装 glibc
%A 解压缩
%A $ cd ~/tars/SourceDir
%A $ tar -zxf ../glibc-$VGLIBC.tar.gz
%A $ cd glibc-$VGLIBC
%A $ tar -zxf ../../glibc-linuxthreads-$VGLIBC.tar.gz
%A
%A 编译
%A $ cd ~/tars/BuildDir
%A $ mkdir glibc
%A $ cd glibc
%A $ CC=$TARGET-gcc AR=$TARGET-ar RANLIB=$TARGET-ranlib \
%A ../../SourceDir/glibc-$VGLIBC/configure \
%A $TARGET \
%A --prefix=$PREFIX/$TARGET \
%A --enable-add-ons
%A $ make all install
%A
%A 编译安装gcc 的c, c++ 编译器
%A 恢复t-linux 文件
%A $ cd ~/tars/SourceDir/gcc-$VGCC/gcc/config/arm/
%A $ cp t-linux-orig t-linux
%A
%A 解压缩 c++ 编译器
%A $ cd ~/tars/SourceDir/
%A $ tar -zxf ../gcc-g++-$VGCC.tar.gz
%A $
%A $ cd ~/tars/BuildDir
%A $ mkdir gcc
%A $ cd gcc
%A
%A 编译
%A $ ../../SourceDir/gcc-$VGCC/configure \
%A --target=$TARGET \
%A --prefix=$PREFIX \
%A --enable-languages=c,c++ \
%A --with-included-gettext
%A $ make all
%A $ make install
%A
%A
%A 注:
%A 如果你下载的是 filename.tar.bz2,你可以用如下命令之一解压缩,第三种方式在任何系统中都好使。
%A
%A $ tar -jxf filename.tar.bz2
%A $ tar -Ixf filename.tar.bz2
%A $ bzip2 -dc filename.tar.bz2 | tar xf -
%A
%A
%A 如果你是第一次制作 arm-linux 交叉编译环境,强烈建议你用本文所使用的各个程序的版本。如果用其它版本,按照本文的方法可能会在编译的时候出问题,因为我没有时间去测试各个版本的组合。这里是源程序: crossarm.sh,它使用的是:
%A linux-2.4.21.tar.bz2
%A patch-2.4.21-rmk1.gz
%A binutils-2.14.tar.gz
%A gcc-core-2.95.3.tar.gz
%A gcc-g++-2.95.3.tar.gz
%A glibc-2.2.4.tar.gz
%A 生成的 toolchain 大于 150 兆,用如下方法压缩:
%A $ cd ~
%A $ tar -cf armtools.tar /armtools
%A $ bzip2 -z armtools.tar
%A
%A 压缩后生成的 armtools.tar.bz2 大概有 30 几兆。
%A
%A Credit:
%A
http://www.armlinux.org/docs/toolchain/toolchHOWTO/x183.html
%A
http://www.objsw.com/CrossGCC/FAQ-4.html
%A
http://www.bluewind.it/gnuarm.htm
%A
http://penguinppc.org/usr/embedded/howto/PowerPC-Embedded-HOWTO-12.html
%A
%A 本新闻摘自
http://embdev.gotdns.org
%A