在嵌入式系统中,由一个源文件变成最终可执行的二进制文件,要经过三个过程,即编译,链接和重新定位,通过编译或者汇编工具,将源代码变成目标文件,由于目标文件往往不止一个,所以还需要链接工具将它们链接成另外一个目标文件,可以称其为“可重定位程序”。结果定址工具,将“可重定位程序”变成最终可执行文件。
一般的嵌入式系统应用程序的开发,通常采用的是主从模式,通过串口或者网口,使目标机和宿主机相连接。通常来说,编译器,连接器和定址器都是在宿主机上(一般是pc机,对于嵌入式开发而言,还都是运行Linux操作系统的pc)运行的,而最终经过编译-链接-重新定位所得到的二进制可执行文件却都是在目标机上运行的,所以我们把这种编译过程称为“交叉编译”。
常规的开发嵌入式系统的应用程序都是在Linux pc上进行开发,然而由于开发者自身硬件条件受到限制或者是所应用的其他一些软件的制约,不得不在windows下开发的时候,就必须找到适合于自己目标硬件平台的交叉编译器。但是苦于目前网上讨论在windows下开发嵌入式系统应用程序的资料比较少,使许多象我这样的初学者因找不到在windows下使用的编译器而耽误许多宝贵时间,课题迟迟不能进展。
经过5天的长假和网上各路高手的指点,现将在windows下生成交叉编译器的大体步骤写出来,供初学者参考,对于高手可能实在是小菜一碟,本文可能实属班门弄斧之作^_^。
本文针对的目标机为s3c4510b,嵌入式操作系统为uClinux,宿主机为windows2000 professional PC。
因为要在windows下去开发运行在嵌入式系统中的应用程序,首先要有一个能够模拟linux/unix环境的软件,推荐大家去下载安装cygwin(对于选项不太了解的朋友,建议选择全部安装),它对于学习linux/unix操作环境,或者从unix到windows的应用程序移植,尤其是使用gnu工具在windows上进行嵌入式系统开发,非常有用,好处多多 J。具体的用法大家可以去它的网站看看,E文不好的朋友,可以看看志祥版斑竹 yansm大侠写的cygwin使用指南,对 cygwin有个大致的了解。(我想这也就足够了吧J)。
安装后cygwin后,大家就可以到这个网站
http://www.uclinux.org/pub/uClinux/uclinux-elf-tools/tools-20030314 去下载最新的源码包,(可以把所有的东东都下载下来,这里面最重要的应该是build-uclinux-tools.sh这个脚本文件。)供后面制作交叉编译器使用。
在开始之前,请大家打开我们前面安装的cygwin.bat在第一行后加入set CYGWIN=title ntea,这是因为cygwin 启动批处理文件要启动unix文件系统模拟。运行cygwin,在根目录下输入,cd bin
mv sh.exe sh-original.exe
ln –s bash.exe sh.exe
现在对cygwin的修改搞定。(有关修改问题大家可以看那个脚本给出的一个文档,www.uclinux.org/pub/uclinux/archive/8306.html,帮助很大,因为这个文档对一些地方的修改做了非常详细的描述,大家仔细看看,按着进行相应改动就可以了,但是有些步骤因为由我们现在的patch就可以实现的,大家就可以不必修改,由补丁程序自动完成。我在这里不详细阐述,在下面,我只写其他没有说到的一些地方)开始我们的建立交叉编译器的重要环节啦!^_^
我用的是那个台湾网站mac.os.nctu.edu.tw网站的uclinux-samsung-20020318.tar.gz,把它download到装有cygwin的目录下,进行解压,tar xvzf uclinux-samsung-20020318.tar.gz,就会自动生成一个名为uClinux-Samsung的目录,主要这个解包过程可能会出错,但是没关系,leave the error alone,不用管它的。(为了省事,我们还可以直接把在linux pc上配置好的uclinux的内核考到cygwin下来,否则你还需要在cygwin下对内核进行配置)
那个我前面说得非常重要的脚本文件中,对于一些变量(针对路径定义的)我们应该根据自己软件所在的具体位置进行相应的修改,将CYGWIN那个变量前的#去掉。还有下面的一些非常主要的修改
.tar zxvf elf2flt-20030314.tar.gz
cd ..
vi elf2flt-cygwin-020612.patch
删除除了elf.h外的patch项目
patch -p0 <elf2flt-cygwin-020612.patch
tar zxvf gcc-2.95.3.tar.gz
vi gcc-2.95.3/gcc/Makefile.in
change:
info: cpp.info gcc.info lang.info
to:
info: cpp.info lang.info
tar zcvf gcc-2.95.3.tar.gz gcc-2.95.3
进入uclibc/extra/gcc-uclibc删掉gcc-uclibc.c的 #include <libgen.h>
打开 Makefile(该Makefile 也是在uclibc/extra/gcc-uclibc目录下)
gcc-uClibc: gcc-uClibc.h gcc-uClibc.c
$(HOSTCC) $(HOSTCFLAGS) -Wl,-s gcc-uClibc.c -o $(TARGET_ARCH)-uclibc-gcc
在最后面加入 –liberty
在/usr/include/sys/reent.h 732到741行,除了# define _REENT _impure_ptr外,全部注释掉
现在就可以运行脚本命令啦~~,经过上面的改动后,应该是没有什么问题了,整个build过程大约有5-6个小时吧,因为我在做的过程中曾经遇到了好几次错误,所以进行了好几次的continue。如果大家成功build,就会出现
--------------------------------------------------------
Build successful !
--------------------------------------------------------
的字样,那么恭喜你,你已经离成功只有一步之遥了
现在进入/usr/local/arm-elf/bin,运行mv ld.exe ld
ok,now u have succeeded in building the cross compiler. Congratulations!
现在到/usr/local/bin下面是不是看到了企盼已久的arm-elf开头的各种工具^_^,用这些工具我们就可以在windows下像在linux中一样开发我们的用户应用程序了。
以上是我制做交叉编译器时采用的方法,希望能够对其他和我一样刚入门的朋友一些帮助,在这个过程中,我得到了21IC论坛高手tpu的极大的帮助,没有他也就没有本文,在这里向tpu高手表示深深的感谢。