Ubuntu Desktop 9.04(内核版本2.6.28-15) + Arm Xscale
关键字:ubuntu 9.04, arm, xscale, 交叉开发环境, 工具链
一、点评 一个交叉编译环境应该包含四部分:编辑编译链接工具、头文件、库文件、帮助文档。
ubuntu desktop 9.04已经做得相当漂亮了,你还可以安装新氧美化包,那个桌面美得令人难以置信。我原来一直是在红帽9.0上作交叉开发的,红帽9.0是个什么版本,那是上世纪九十年代中期的linux发行版本,与今日的
ubuntu 9.04那是不可同日而语的。于是自己试着在
ubuntu
desktop 9.04上搭建一套全新的基于Arm
Xscale硬件平台的交叉开发环境。我们都知道自己搭建这样的交叉开发环境无非采用三种方式:一是从网上下载通用的原始的编译工具源代码(如gcc,
glibc,
binutils等),然后自己一个一个编译再二次编译产生需要的交叉开发工具;二是下载别人已经做好的成品或者半成品,解压到某个目录下,并定义一些环
境变量即可;三是利用别人写好的用于自动编译的脚本,下载这些脚本后直接运行即可,这些脚本会自动从网上下载需要的源代码包,然后编译,然后安装到某个目
录下。第一种方法比较复杂,只有牛人才可胜任,什么?你菜鸟一个也做成功了!那只能说明是你对着别人写的操作步骤,并带有一点瞎猫遇到死老鼠的运气。第二
种方法比较简单,如果你的运气足够好——刚好从网上搜刮到适合自己硬件平台的交叉开发包,那还等什么,赶快下载吧,说不定几分钟后别人就删了呢,那时你就
像一个在股票还在一个劲地往上涨的时候清仓那样,肠子都会悔青的。最后一种方法其实就是把第一种手工执行的命令打包形成一个脚本程序(由超牛的人完成),
你只需下载并运行这样的脚本即可。
由于本人一向比较赖,所以就采用第三种方法来搭建我的交叉开发环境,好了,你可能很不耐烦了,那就现在动手吧:
******
后来发现这样的工具链只能编译2.6.28及以下的内核版本,当编译更高的版本时报如下错误:
include/linux/compiler-gcc4.h:7:3: error: #error Your version of gcc miscompiles the __weak directive
include/linux/compiler-gcc4.h:7说明这个交叉编译工具版本太低,请参照我的另一篇文章去建立更高版本的交叉编译工具链。
******
二、动手:
(说明:下面以#开头的行表示是root用户在执行命令,“--“引出注释内容,分号前的才是真正要执行的命令)
# apt-get -f install; 解决历史遗留问题;
# apt-get -y install build-essential; --安装C语言开发环境
# apt-get -y install bison flex patch
# useradd -m -s /bin/bash cross_user; --创建一个专门用于交叉开发的用户先。
# passwd cross_user; --修改用户密码。
# mkdir /opt/crosstool; --编译之后的交叉工具链放在这里呢。
# chown cross_user /opt/crosstool; --使用户cross_user对目录/opt/crosstool可写。
# apt-get -y install gcc-3.4; --由于
ubuntu 9.04默认安装的gcc版本太新了,所以需要再安装一个较低版本的gcc。
# cd /usr/bin && rm gcc && ln -sv gcc-3.4 gcc; --使gcc指到较低版本的编译器。
# su - cross_user; --切换到普通用户cross_user
$ mkdir downloads && cd downloads; --这个就不用解释了吧。
$ wget --好了,把这个脚本下载来先。
--如果这里没法下载,就去我的魔盘上下载,下载地址
$ tar -zxf crosstool-0.43.tar.gz && cd crosstool-0.43; --解压并进入解压后的目录。
$
./demo-arm-xscale.sh;
--赶快运行这个脚本吧(如果你的开发板不是xscale,那么就不要运行这个脚本了,你列一下文件demo-arm*,找到适合于你自己开发板的脚本并
运行),这个脚本完成以下工作:1)下载需要的软件包(所有的包被下载到目录~/downloads下),2)编译(时间较长),3)安装工具链(到
/opt/crosstool下)。
---呃,天拉!编译过程中报错并退出编译,错误信息如下:
/home/cross_user/crosstool-0.43/build/arm-xscale-linux-gnu/gcc-4.1.1-glibc-2.3.2/build-glibc/csu/version-info.h:1:1:
missing terminating " character
系统在编译生成version.o时候发现version-info.h文件有错误。
解决办法如下:
$ cd ~/downloads
$ tar -jxf glibc-2.3.2.tar.bz2
$ cd glibc-2.3.2/csu
修改里面的文件Makefile:
文件末尾有2处echo
echo
"\"Compiled on a $$os $$version system" \
"on
`date +%Y-%m-%d`.\\n\"" ;; \
改为:
echo
"\"Compiled on a $$os $$version system" \
"on
`date +%Y-%m-%d`.\\\\n\"" ;; \
echo
"\"Available extensions:\\n\"";
改为:
echo
"\"Available extensions:\\\\n\""; \
保存并重新压缩为glibc-2.3.2.tar.bz2,覆盖原来downloads目录下的glibc-2.3.2.tar.bz2。什么?你不会压缩,我靠,告诉你吧:
$ cd && cd downloads && rm -f glibc-2.3.2.tar.bz2
$ tar -jcf glibc-2.3.2.tar.bz2 glibc-2.3.2
然后重新编译:
$ cd ~/downloads/crosstool-0.43
$ ./demo-arm-xscale.sh; --好啦,去室外抽一根烟吧,或者去喝一杯咖啡,没咖啡,茶水也行啊,或者干脆拿本杂志去蹲个厕所,半个小时后出来。……………………
编译完了,没有报错了,那恭喜你,还等什么,赶快清点战果呀
$ cd /opt/crosstool
$ ls -la
drwxr-xr-x 3 wochi wochi 4096 2009-10-22 21:43 gcc-4.1.0-glibc-2.3.2
$ cd gcc-4.1.0-glibc-2.3.2
$ ls -la
drwxr-xr-x 12 wochi wochi 4096 2009-10-22 21:33 arm-xscale-linux-gnu
$ cd arm-xscale-linux-gnu
$ ls -la
drwxr-xr-x 11 wochi wochi 4096 2009-10-22 21:23 arm-xscale-linux-gnu
-rw-r--r-- 1 wochi wochi 1007 2009-10-22 21:02 arm-xscale-linux-gnu.crosstoolconfig.txt
drwxr-xr-x 2 wochi wochi 4096 2009-10-22 21:33 bin
drwxr-xr-x 3 wochi wochi 4096 2009-10-22 21:33 distributed
drwxr-xr-x 3 wochi wochi 4096 2009-10-22 21:33 include
drwxr-xr-x 2 wochi wochi 4096 2009-10-22 21:33 info
drwxr-xr-x 3 wochi wochi 4096 2009-10-22 21:33 lib
drwxr-xr-x 3 wochi wochi 4096 2009-10-22 21:33 libexec
drwxr-xr-x 4 wochi wochi 4096 2009-10-22 21:33 man
drwxr-xr-x 2 wochi wochi 4096 2009-10-22 21:33 share
drwxr-xr-x 2 wochi wochi 4096 2009-10-22 21:33 tmp
--怎么样?硕果累累了吧,这里有交叉编译工具、库、头文件和帮助文档,一应俱全,但是还别急,最后还要定义一个环境变量。
在文件~/.bash_profile的最后增加一行:
export PATH=/opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-xscale-linux-gnu/bin:$PATH
然后执行命令:
$ cd && . .bashrc
或者你重新登录cross_user,这样交叉编译工具所在的目录就放在环境变量PATH的最前面了,如果重新登录也不会,你干脆重启电脑好了。
三、测试:$ vim abc.c; --编辑一个c语言程序abc.c, Hello World一下先。
#include
main()
{
printf("Hello World!\n");
}
$ arm-xscale-linux-gnu-gcc abc.c -o abc; --编译产生可执行程序abc
$ ./abc; --什么?你就想运行!这肯定失败!!难道你忘了,abc只能下载到目标板上运行的啊,这就是交叉编译环境的根本,在电脑上写程序并编译,只能在目标板上运行,烦吧,简直烦死人了,谁叫你从事这一行呢,认命吧。
$ file abc; --看看这个程序的类型:
abc: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), for GNU/Linux 2.4.18, not stripped
看到了吧,这是一个可执行程序,但是是ARM目标板的。
四、配置编辑工具:
1、vim
ubuntu 9.04 desktop默认安装的是一个小型vi编辑工具,编程人员需要用到的很多功能没有,需要安装全功能的vim,方法如下:
# apt-get install vim-full vim-common
# su - cross_user
$ vi .vimrc; --输入如下内容:
set autoindent
set cindent
set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s
set nowrap
syntax enable
set ts=4
set hlsearch
set ruler
set showcmd
set nu
--这样编辑程序时高亮语法显示、自动缩进等等,非常方便。
2、ctags
ctags配合vim工具,可以实现c语言源代码树的快速浏览编辑
# apt-get install exuberant-ctags
--然后进入源码树的根,执行命令:
# ctags -R *; --这样就生成了标签文件tags,然后使用vim打开文件,采用vim命令:
光标停在一个关键字上(比如函数名),然后ctrl+]跳到此函数的具体定义代码,按ctrl+t返回。一
些常用的命令是(光标先移到要跟踪的标帜符上):ctrl+](直接跳转到第一个标记处),g
ctrl+](列出当前光标处单词的所有标记并提示跳转),:tags(列出所有已查询标记);:ts
(列出所有标记tag的出处并提示选择跳转),ctrl+t(返回到前一个被查询过的标记)。
3、vim使用技巧:
删除 DOS 回车符 ^M::%s/\r//g
删除行尾空格:%s= *==g
删除行尾空格和 DOS 回车符:%s#\s*\r\?$##
压缩多行空行为一行:%s/^\n\+/\r/
普通替换:%s/fred/joe/igc
删除所有的空行:光标移到首行,一次输入!Ggrep -v "^$"
整理杂乱的c语言代码:gg=G
整理{}内的代码:=a{
附录:采用crosstool-ng构造高版本的交叉编译。
# mdir /tmp/crosstool-ng
# cd /tmp/crosstool-ng
# wget crosstool-ng/crosstool-ng-1.5.0.tar.bz2
# tar -jxf crosstool-ng-1.5.0.tar.bz2
# cd crosstool-ng
# apt-get install biso flex mawk gawk texinfo automake cvs libtool gcj libncurses5-dev
# ./configure --prefix=/opt/crosstool-ng
# make
# make install
# cd /tmp
# rm -rf crosstool-ng
# vim ~/.bashrc; --加入以下一行:
export PATH=/opt/crosstool-ng/bin:$PATH
# source ~/.bashrc
# mkdir ct-ng
# cd ct-ng
# ct-ng menuconfig
# ct-ng build