当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 25 篇帖子 ]  前往页数 1, 2  下一页
作者 内容
1 楼 
 文章标题 : [原创]在ubuntu下动手编译arm-elf工具
帖子发表于 : 2007-01-07 20:35 
头像

注册: 2006-11-15 14:28
帖子: 67
地址: Beijing
送出感谢: 0 次
接收感谢: 3
前几天说了正和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系统默认是没有安装的,可以用下面的命令安装:

代码:
sudo apt-get install build-essential

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


解压文件:
现建立工作目录,我的目录建在/home/volans/gcc4,以后把这个目录称为“工作目录”。然后把下载的四个压缩文件拷贝到这个目录下,运行解压缩命令。
代码:
  tar zxvf newlib-1.14.0.tar.gz
  tar jxvf gcc-4.1.1.tar.bz2
  tar jxvf binutils-2.17.tar.bz2
  tar jxvf gdb-6.6.tar.bz2


正式编译开始:

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

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

#定义各个源文件的目录
GCC_SOURCE="/home/volans/gcc4/gcc-4.1.1"
BINUTILS_SOURCE="/home/volans/gcc4/binutils-2.17"
LIB_SOURCE="/home/volans/gcc4/newlib-1.14.0"
GDB_SOURCE="/home/volans/gcc4/gdb-6.6"


代码:
#编译的参数
BINUTILS_CONFIG="--target=arm-elf --prefix=$TARGET_PWD --enable-interwork --enable-multilib --with-float=soft"
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"
LIB_CONFIG=$BINUTILS_CONFIG
GDB_CONFIG=$BINUTILS_CONFIG


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


代码:
#编译binutils
cd $BINUTILS_SOURCE

./configure $BINUTILS_CONFIG

make all install


代码:
#初步编译gcc,为了可以编译newlib
cd $GCC_SOURCE

./configure $GCC_CONFIG

make all-gcc install-gcc


代码:
#编译newlib
cd $LIB_SOURCE

./configure $LIB_CONFIG

make all install


代码:
#完全编译gcc
cd $GCC_SOURCE

make all install


代码:
#编译gdb
cd $GDB_SOURCE

./configure $GDB_CONFIG

make all install


到此为止,arm-elf就成功建立起来了,编辑/etc/bash.bashrc,加入如下代码,就可以一劳永逸的改变PATH环境变量。
代码:
if [ -d /usr/local/arm/gnuarm4.1.1 ]; then
        PATH=/usr/local/arm/gnuarm4.1.1/bin:"${PATH}"
fi


现在就验证一下自己的成果吧:
代码:
//写个小程序,main.c
#include <stdio.h>
int main()
{
    printf("Hello world!\n");
    return 0;
}


编译一下,生成a.out
代码:
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
-L/usr/local/arm/gnuarm4.1.1/lib/gcc/arm-elf/4.1.1/


用arm模拟器运行一下,是不是有输出呢?
代码:
arm-elf-run a.out


可以查一下a.out的头信息。
代码:
arm-elf-readelf -h  a.out

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



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

脚本文件链接:http://files.myopera.com/volans/blog/arm-gcc-automatic.sh


最后由 volans 编辑于 2007-01-08 11:56,总共编辑了 2 次

页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2007-01-07 20:45 
头像

注册: 2006-11-15 14:28
帖子: 67
地址: Beijing
送出感谢: 0 次
接收感谢: 3
脚本的全部内容。

代码:
#!/bin/bash

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

#source directory and target director
WORK_PWD=$(pwd)
echo $WORK_PWD

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

#make configure
BINUTILS_CONFIG="--target=arm-elf --prefix=$TARGET_PWD --enable-interwork --enable-multilib --with-float=soft"
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"
LIB_CONFIG=$BINUTILS_CONFIG
GDB_CONFIG=$BINUTILS_CONFIG

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

#make target dir for install if possible
if [ -d $TARGET_PWD ]; then
   rm -rf $TARGET_PWD
   mkdir $TARGET_PWD
else
   mkdir $TARGET_PWD
fi

######## make binutils #########################

cd $BINUTILS_SOURCE

#configure
./configure $BINUTILS_CONFIG

#make
make all install

#################################################

######### make gcc for build new lib ############

cd $GCC_SOURCE

#configure
./configure $GCC_CONFIG

#make
make all-gcc install-gcc

#################################################

########## make new lib #########################

cd $LIB_SOURCE

#configure
./configure $LIB_CONFIG

#make
make all install

#################################################

######## make all gcc ###########################

cd $GCC_SOURCE

make all install

#################################################

######### make gdb ##############################

cd $GDB_SOURCE

#configure
./configure $GDB_CONFIG

make all install

#################################################


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2007-01-15 9:29 

注册: 2005-09-28 12:01
帖子: 258
送出感谢: 0 次
接收感谢: 0 次
好东西阿,尤其是那个newlib,我前几天参考clfs写的arm-linux,还有内核头文件,差别很大,搞的累死了
http://blog.csdn.net/chenzhixin/archive ... 81442.aspx

我也去编译下

你是学电子的不?LINUX居然学的这么N....

PS:兄弟几岁了?


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2007-01-15 9:30 

注册: 2005-09-28 12:01
帖子: 258
送出感谢: 0 次
接收感谢: 0 次
哦,对了,楼主的glibc支持的是哪一类的多线程?


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2007-01-15 16:39 
头像

注册: 2006-11-15 14:28
帖子: 67
地址: Beijing
送出感谢: 0 次
接收感谢: 3
newlad 写道:
好东西阿,尤其是那个newlib,我前几天参考clfs写的arm-linux,还有内核头文件,差别很大,搞的累死了
http://blog.csdn.net/chenzhixin/archive ... 81442.aspx

我也去编译下

你是学电子的不?LINUX居然学的这么N....

PS:兄弟几岁了?


是学电子的,但并非嵌入式科班出身,我学的是微电子。
谢谢你问的是“几岁了”,呵呵,没有问“几十岁了”。我没那么小,也没那么老。毕业三年而已。


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2007-01-15 16:57 
头像

注册: 2006-11-15 14:28
帖子: 67
地址: Beijing
送出感谢: 0 次
接收感谢: 3
其实我是Linux初学者。

多线程?没怎么明白你的意思。你是说:--enable-interwork --enable-multilib这两个参数么?


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2007-01-17 12:37 

注册: 2006-12-30 20:09
帖子: 30
送出感谢: 0 次
接收感谢: 0 次
看了一下LZ推荐的论坛,对你们的工作还是挺感兴趣的。
问个问题:为什么要自己写个这样的OS呢?与剪裁后的emb linux kernel相比,有什么优势?
当然,作为研究兴趣写个OS也是很有意思的事


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2007-01-17 16:12 
头像

注册: 2006-11-15 14:28
帖子: 67
地址: Beijing
送出感谢: 0 次
接收感谢: 3
moonse 写道:
看了一下LZ推荐的论坛,对你们的工作还是挺感兴趣的。
问个问题:为什么要自己写个这样的OS呢?与剪裁后的emb linux kernel相比,有什么优势?
当然,作为研究兴趣写个OS也是很有意思的事


为什么要写:
很大程度上是为了乐趣,也算是对自己知识的一个巩固和强迫自己去学习一些东西。你知道工作以后就很难静心学一些东西。另外一个目的就是我们希望把文挡做的比较健全,这样更多的初学者可以学到很多东西。

与嵌入式 linux内核相比有何优势:
其实很多的代码是参考0.11的内核写的,优势谈不上,比较简单,采用平面内核结构,绝对基于ARM处理器,不论是学ARM还是学操作系统原理在这个项目的文档/代码都可以有所得。

有兴趣来捧场啊。即将实现信号。


页首
 用户资料  
 
9 楼 
 文章标题 :
帖子发表于 : 2007-01-18 15:50 

注册: 2006-12-30 20:09
帖子: 30
送出感谢: 0 次
接收感谢: 0 次
嗯,自己写OS的确有挑战,也挺有意思的。从头做一遍挺不容易的,但书本上看到的始终会觉得点虚。

现在没时间啊,有一大堆的论文要看,老板还要逼着干活。不过还是一直挺关注嵌入式linux开发的


页首
 用户资料  
 
10 楼 
 文章标题 :
帖子发表于 : 2007-02-04 10:29 

注册: 2007-02-03 9:12
帖子: 39
送出感谢: 0 次
接收感谢: 0 次
我用你的方法编译出的编译器来编译uClinux老是不成功,能不能讲讲uClinux的编译方法。谢谢!


页首
 用户资料  
 
11 楼 
 文章标题 :
帖子发表于 : 2007-02-05 12:45 
头像

注册: 2006-11-15 14:28
帖子: 67
地址: Beijing
送出感谢: 0 次
接收感谢: 3
rayfox 写道:
我用你的方法编译出的编译器来编译uClinux老是不成功,能不能讲讲uClinux的编译方法。谢谢!


很抱歉,我也没弄过uClinux,当然也就不太知道相关的东西了。不过你不妨说说是怎么个不成功,把错误信息放上来,大家分析一下。


页首
 用户资料  
 
12 楼 
 文章标题 :
帖子发表于 : 2007-02-05 18:04 

注册: 2006-09-13 20:28
帖子: 7
送出感谢: 0 次
接收感谢: 0 次
请问一下为什么我的老是编译不成功?
root@davesliu-laptop:/# 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.2/ main.c -L/usr/local/arm/gnuarm4.1.1/lib/gcc/arm-elf/4.1.2

运行 显示出错如下.
/usr/local/arm/gnuarm4.1.1/lib/gcc/arm-elf/4.1.2/../../../../arm-elf/bin/ld:crt0.o:没有这个文件:没有那个文件或目录
collect2: ld 返回 1

大意是Ctr0.o不存在,请问楼主是不是下载的GCC压缩包有问题?
PS:我的ubuntu系统自带的GCC版本是用新利得软件包自动升级的4.0.3版,但是自己去下载gcc-4.0.3.tar.bz2 用来编译gcc时老是报错,然后我用的gcc-4.1.2.tar.bz2 来代替的


页首
 用户资料  
 
13 楼 
 文章标题 :
帖子发表于 : 2007-02-06 12:34 
头像

注册: 2006-11-15 14:28
帖子: 67
地址: Beijing
送出感谢: 0 次
接收感谢: 3
TO:楼上,我有两个疑问:

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.2/ main.c -L/usr/local/arm/gnuarm4.1.1/lib/gcc/arm-elf/4.1.2 为什么后面的是4.1.2??是笔误还是??请到你的安装目录下看看是否有你说的??

2. 你的main.c是什么内容??有没有包含其他文件??看了这个才能确定是不是Make命令参数的问题。


页首
 用户资料  
 
14 楼 
 文章标题 :
帖子发表于 : 2007-02-11 22:52 

注册: 2006-09-13 20:28
帖子: 7
送出感谢: 0 次
接收感谢: 0 次
谢谢楼主的解答
4.1.2不是笔误,这是因为我用的GCC版本是4.1.2的。ubuntu系统自带的GCC版本是用新利得软件包自动升级的4.0.3版,但是自己去下载gcc-4.0.3.tar.bz2 用来编译gcc时老是报错,然后我用的gcc-4.1.2.tar.bz2 来代替的
main.c就是一个HELLO WORLD代码,用GEDIT写的,没有包含其他文件。


页首
 用户资料  
 
15 楼 
 文章标题 : 我编译binutils到ARM上用,可是没有make过
帖子发表于 : 2007-03-13 11:57 

注册: 2007-03-13 11:54
帖子: 3
送出感谢: 0 次
接收感谢: 0 次
我先是 ./configure -target=arm-linux生成 Makefile
然后执行 make ,提示如下:


make[1]: Leaving directory `/home/pingtu/binutils-2.14/intl'
make[1]: Entering directory `/home/pingtu/binutils-2.14/libiberty'
if [ x"" != x ]; then \
gcc -c -DHAVE_CONFIG_H -g -O2 -I. -I./../include -W -Wall -Wtraditional -pedantic regex.c -o pic/regex.o; \
else true; fi
gcc -c -DHAVE_CONFIG_H -g -O2 -I. -I./../include -W -Wall -Wtraditional -pedantic regex.c -o regex.o
regex.c:132: warning: conflicting types for built-in function ‘malloc’
In file included from /usr/local/include/bits/string2.h:1185,
from /usr/local/include/string.h:360,
from regex.c:151:
/usr/local/include/stdlib.h:527: error: conflicting types for ‘malloc’
regex.c:132: error: previous declaration of ‘malloc’ was here
In file included from ./../include/xregex.h:26,
from regex.c:195:
./../include/xregex2.h:548: warning: ISO C90 does not support ‘static’ or type qualifiers in parameter array declarators
regex.c: In function ‘init_syntax_once’:
regex.c:286: warning: value computed is not used
regex.c:286: warning: value computed is not used
In file included from regex.c:649:
regex.c: In function ‘byte_regex_compile’:


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 25 篇帖子 ]  前往页数 1, 2  下一页

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译