在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2306|回复: 1

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

[复制链接]
发表于 2004-4-30 23:57:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
[这个贴子最后由vhdlcode在 2004/05/17 09:34am 第 2 次编辑]

一步一步的制作 arm-linux 交叉编译环境
http://embdev.gotdns.org
我们使用以下版本的文件为例子建立 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 交叉编译环境的安装在这里
安装linux 的头文件
当你为不同类型的ARM编译gcc,或编译不同版本的kernel,或交叉编译gcc 时都需要一套不同的linux头文件。

解压缩,打补丁
$ cd ~/tars/SourceDir
$ tar -zxf ../linux-$VLINUX.tar.gz
$ cd linux
$ zcat ../../patch-$VLINUX-$VLINUX_PATCH.gz | patch -p1
清理一下
$ make mrproper


建立连接
如果是linux kernel 已经支持的板子
查看 linux/arch/arm/def-configs 下面的文件名,例如:lart,at91rm9200dk 等。你可以用 make ARCH=arm that_file_name_config 来产生默认的配置。
例如:
make ARCH=arm lart_config
make ARCH=arm at91rm9200dk
以 lart 为例:
$ make lart_config
$ yes "" | make oldconfig
$ make include/linux/version.h
或:
$ make ARCH=arm lart_config
$ make ARCH=arm 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。
如果是clps711x的CPU
连接应该为:
$ cd include/asm-arm
$ rm -f arch proc
$ ln -s arch-clps711x arch
$ ln -s proc-armv proc
$ cd ../../
为你自己的系统定制:
$ make ARCH=arm 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 指令。

拷贝头文件
$ mkdir -p $PREFIX/$TARGET/include
$ cp -dR include/linux $PREFIX/$TARGET/include
$ cp -dR include/asm-arm $PREFIX/$TARGET/include/asm
为 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
编译安装binutils
这里用不到前面准备的 linux 头文件

解压缩
$ cd ~/tars/SourceDir
$ tar -zxf ../binutils-$VBINUTILS.tar.gz
编译
$ cd ~/tars/BuildDir
$ mkdir binutils
$ cd binutils
$ ../../SourceDir/binutils-$VBINUTILS/configure \
                       --target=$TARGET \
                       --prefix=$PREFIX
$ make all install
输出 binutils 的路径到环境变量中
你可以把它加到 .bashrc 中。如果你这么做了,你需要 logout 再 login 才能生效。
否则在 bash 的命令行上输入它并立即生效,但你 logout 再 login 时它就无效了。
export PATH=$PREFIX/binPATH
编译安装gcc 的c 编译器
解压缩
$ 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++ 的编译器。

修改 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
编译
$ 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
编译安装 glibc
解压缩
$ cd ~/tars/SourceDir
$ tar -zxf ../glibc-$VGLIBC.tar.gz
$ cd glibc-$VGLIBC
$ tar -zxf ../../glibc-linuxthreads-$VGLIBC.tar.gz
编译
$ 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
编译安装gcc 的c, c++ 编译器
恢复t-linux 文件
$ cd ~/tars/SourceDir/gcc-$VGCC/gcc/config/arm/
$ cp t-linux-orig t-linux
解压缩 c++ 编译器
$ cd ~/tars/SourceDir/
$ tar -zxf ../gcc-g++-$VGCC.tar.gz
$
$ cd ~/tars/BuildDir
$ mkdir gcc
$ cd gcc
编译
$ ../../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
发表于 2008-11-10 00:08:59 | 显示全部楼层
写的很清楚,有时间试试。不过好象版本有点低,如何做升级的版本啊!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-2-3 16:07 , Processed in 0.022983 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表