LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 880|回复: 3

Linux下编译arm-elf工具

[复制链接]
发表于 2007-1-8 11:45:29 | 显示全部楼层 |阅读模式
前几天说了正和arm-elf干的热火朝天的,经过一个较为漫长的煎熬以后,终于功夫不负苦心人,搞定了。小庆祝一下,感谢gnuarm邮件列表里的兄弟曾给我的建议。在此把经验与大家分享一下,独乐乐不如与人乐乐。

前言:
为什么一定要建立arm-elf工具呢?其实必要性不是很大,3.x的版本网上有下载,而且现在的arm-linux工具也可以生成裸机代码,从前arm-elf和arm-linux的差别现在已经不是非常重要了。前一阵子在网上看见一个哥们在写操作系统,想参与一下,把我的业余时间填满。这是他的论坛,有兴趣的可以看一下,目前人气还不是旺,顺便帮忙宣传了。他已经开始了一阵子,他在windows下开发,编译工具用的是arm-elf-4.1.1。
为了更少的更改,我只能选择和他一样的编译器,但是gnuarm网站上竟然只提供cygwin x86和linux x86-64的版本,完全忽视我们linux x86-32的广大用户,至今没搞懂为什么。只好自己编译了……

准备工作:
下载源文件:
gcc-4.1.1.tar.bz2  
gdb-6.6.tar.bz2      
newlib-1.14.0.tar.gz
binutils-2.17.tar.bz2

newlib是redhat社区的一个针对嵌入式系统的开源库文件,gdb你也可以选择insight,差别就是后者是基于图形界面的。这些东西在gnuarm网站有下载,当然在gnu网站上会得到最新的版本。本文只探讨使用上述版本的程序编译。

确认系统环境:
请确定你的系统安装了完整的开发包:gcc, gdb等等,ubuntu系统默认是没有安装的,可以用下面的命令安装:

  1. sudo apt-get install build-essential
复制代码

最好保证你的系统中的gcc版本和要编译的源程序版本相同,否则容易出现问题;可以用下面的命令查询版本:
  1. gcc -v
复制代码


解压文件:
现建立工作目录,我的目录建在/home/volans/gcc4,以后把这个目录称为“工作目录”。然后把下载的四个压缩文件拷贝到这个目录下,运行解压缩命令。

  1.   tar zxvf newlib-1.14.0.tar.gz
  2.   tar jxvf gcc-4.1.1.tar.bz2
  3.   tar jxvf binutils-2.17.tar.bz2
  4.   tar jxvf gdb-6.6.tar.bz2
复制代码


正式编译开始:

我比较笨,记不住那一串串的配置命令,也没大块的时间在电脑面前等,所以我写了一个自动配置编译的脚本文件,把这个脚本拷贝到工作目录下运行就可以了。在此我把脚本文件详细介绍一下,其实也就是手动编译的整个过程了。


  1. #这个是安装的目标路径,编译的结果放在这里
  2. TARGET_PWD="/usr/local/arm/gnuarm4.1.1"

  3. #定义各个源文件的目录
  4. GCC_SOURCE="/home/volans/gcc4/gcc-4.1.1"
  5. BINUTILS_SOURCE="/home/volans/gcc4/binutils-2.17"
  6. LIB_SOURCE="/home/volans/gcc4/newlib-1.14.0"
  7. GDB_SOURCE="/home/volans/gcc4/gdb-6.6"
复制代码


  1. #编译的参数
  2. BINUTILS_CONFIG="--target=arm-elf --prefix=$TARGET_PWD --enable-interwork --enable-multilib --with-float=soft"
  3. GCC_CONFIG="--target=arm-elf --prefix=$TARGET_PWD --enable-interwork --enable-multilib --enable-languages=c,c++ --with-newlib --with-headers=$LIB_SOURCE/newlib/libc/include --with-float=soft"
  4. LIB_CONFIG=$BINUTILS_CONFIG
  5. GDB_CONFIG=$BINUTILS_CONFIG
复制代码


  1. #把目标路径的bin放入PATH,要用arm-elf工具编译newlib。
  2. export PATH="$PATH:$TARGET_PWD/bin"
复制代码


  1. #编译binutils
  2. cd $BINUTILS_SOURCE

  3. ./configure $BINUTILS_CONFIG

  4. make all install
复制代码


  1. #初步编译gcc,为了可以编译newlib
  2. cd $GCC_SOURCE

  3. ./configure $GCC_CONFIG

  4. make all-gcc install-gcc
复制代码


  1. #编译newlib
  2. cd $LIB_SOURCE

  3. ./configure $LIB_CONFIG

  4. make all install
复制代码


  1. #完全编译gcc
  2. cd $GCC_SOURCE

  3. make all install
复制代码


  1. #编译gdb
  2. cd $GDB_SOURCE

  3. ./configure $GDB_CONFIG

  4. make all install
复制代码


到此为止,arm-elf就成功建立起来了,编辑/etc/bash.bashrc,加入如下代码,就可以一劳永逸的改变PATH环境变量。

  1. if [ -d /usr/local/arm/gnuarm4.1.1 ]; then
  2.         PATH=/usr/local/arm/gnuarm4.1.1/bin:"${PATH}"
  3. fi
复制代码


现在就验证一下自己的成果吧:

  1. //写个小程序,main.c
  2. #include <stdio.h>
  3. int main()
  4. {
  5.     printf("Hello world!\n");
  6.     return 0;
  7. }
复制代码


编译一下,生成a.out

  1. arm-elf-gcc -I/usr/local/arm/gnuarm4.1.1/arm-elf/include -L/usr/local/arm/gnuarm4.1.1/lib/gcc/arm-elf/4.1.1/ main.c
  2. -L/usr/local/arm/gnuarm4.1.1/lib/gcc/arm-elf/4.1.1/
复制代码


用arm模拟器运行一下,是不是有输出呢?

  1. arm-elf-run a.out
复制代码


可以查一下a.out的头信息。

  1. arm-elf-readelf -h  a.out
复制代码

输出如下:

  1.   ELF 头:
  2.   Magic:  7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 00 00
  3.   Class:                             ELF32
  4.   Data:                              2's complement, little endian
  5.   Version:                           1 (current)
  6.   OS/ABI:                            ARM
  7.   ABI Version:                       0
  8.   Type:                              EXEC (可执行文件)
  9.   Machine:                           ARM
  10.   Version:                           0x1
  11.   入口点地址:              0x8100
  12.   程序头起点:              52 (bytes into file)
  13.   Start of section headers:          48636 (bytes into file)
  14.   标志:             0x202, has entry point, GNU EABI, software FP
  15.   本头的大小:       52 (字节)
  16.   程序头大小:       32 (字节)
  17.   程序头数量:       1
  18.   节头大小:         40 (字节)
  19.   节头数量:         13
  20.   字符串表索引节头: 12
复制代码



到此结束啦,轮到你去折磨arm-elf了,加油吧!

脚本文件链接:http://files.myopera.com/volans/blog/arm-gcc-automatic.sh
 楼主| 发表于 2007-1-8 11:47:31 | 显示全部楼层
脚本的全部内容。


  1. #!/bin/bash

  2. # Brif: This is the scrip for build arm-elf tools.
  3. # Source file: binutils-2.17.tar.bz2,gcc-4.1.1.tar.bz2,gdb-6.6.tar.bz2,newlib-1.14.0.tar.gz
  4. #
  5. # Notes: Please run this script with the root account or you can run "sudo bash"
  6. #           Express all the compressed file to WORK_PWD below
  7. #
  8. # Author: Volans Wang
  9. #         volansw@gmail.com
  10. #

  11. #source directory and target director
  12. WORK_PWD=$(pwd)
  13. echo $WORK_PWD

  14. TARGET_PWD="/usr/local/arm/gnuarm4.1.1"
  15. GCC_SOURCE="/home/volans/gcc4/gcc-4.1.1"
  16. BINUTILS_SOURCE="/home/volans/gcc4/binutils-2.17"
  17. LIB_SOURCE="/home/volans/gcc4/newlib-1.14.0"
  18. GDB_SOURCE="/home/volans/gcc4/gdb-6.6"

  19. #make configure
  20. BINUTILS_CONFIG="--target=arm-elf --prefix=$TARGET_PWD --enable-interwork --enable-multilib --with-float=soft"
  21. GCC_CONFIG="--target=arm-elf --prefix=$TARGET_PWD --enable-interwork --enable-multilib --enable-languages=c,c++ --with-newlib --with-headers=$LIB_SOURCE/newlib/libc/include --with-float=soft"
  22. LIB_CONFIG=$BINUTILS_CONFIG
  23. GDB_CONFIG=$BINUTILS_CONFIG

  24. #export the cross compiler to the PATH
  25. export PATH="$PATH:$TARGET_PWD/bin"

  26. #make target dir for install if possible
  27. if [ -d $TARGET_PWD ]; then
  28.         rm -rf $TARGET_PWD
  29.         mkdir $TARGET_PWD
  30. else
  31.         mkdir $TARGET_PWD
  32. fi

  33. ######## make binutils #########################

  34. cd $BINUTILS_SOURCE

  35. #configure
  36. ./configure $BINUTILS_CONFIG

  37. #make
  38. make all install

  39. #################################################

  40. ######### make gcc for build new lib ############

  41. cd $GCC_SOURCE

  42. #configure
  43. ./configure $GCC_CONFIG

  44. #make
  45. make all-gcc install-gcc

  46. #################################################

  47. ########## make new lib #########################

  48. cd $LIB_SOURCE

  49. #configure
  50. ./configure $LIB_CONFIG

  51. #make
  52. make all install

  53. #################################################

  54. ######## make all gcc ###########################

  55. cd $GCC_SOURCE

  56. make all install

  57. #################################################

  58. ######### make gdb ##############################

  59. cd $GDB_SOURCE

  60. #configure
  61. ./configure $GDB_CONFIG

  62. make all install

  63. #################################################
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-1-8 11:52:11 | 显示全部楼层
好东西啊,谢啦,版主应该加精了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-9 10:01:56 | 显示全部楼层
只是困扰了一阵子了,终于弄过去了。把经验和更多的人分享一下罢了。精华与否到不重要,希望可以帮助一些人就挺高兴了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表