本章要讲述的是自动创建交叉编译环境的方法。目标,针对商业硬件平台,厂家都会为您提供一个研发包,我用过XX厂家的IXP425和MIPS的,很地方便,记得我第一次接触嵌入式研发,拿着这个研发包自动化创建交叉编译环境、编译内核、建立根文档系统、创建Ram Disk,我反复做了三四次,结果还不知道自己究竟做了些什么,呵呵,够傻吧……
所以,建议没有这方面经验的读者,还是首先尝试一下手工创建的方法吧,而本章接下来的内容,是送给曾被他深深伤害而不想再次去亲历这项工作而又想提高交率而又在通用平台上工作没有商业研发包的朋友。
建立交叉研发工具链
准备工具:
buildroot-0.9.27.tar.tar
只需要一个软件?对,其他的不用准备了,buildroot事实上是个脚本和补丁的集合,其他需要用到的软件,如gcc、uClibc,您只需在buildroot中指明相应的版本,他会自动去给您下载。
事实上,buildroot到网上去下载所需的任何工作是需要时间的,除非您的带宽足够,否则下载软件时间或许会占去80%,而我在做这项工作之间,所需的工作链全部都在我本地硬盘上,我解压开buildroot后,新建dl文档夹,将任何工具源码的压缩包拷贝进去,呵呵,buildroot就不用去网上下载了。
我的软件清单:
Linux-libc-headers-2.4.27.tar.bz2
Gcc-3.3.4.tar.bz2
binutils 2.15.91.0.2.tar.bz2
uClibc 0.9.27.tar.bz2
genext2fs_1.3.orig.tar.gz
ccache-2.3.tar.gz
将他拷贝到${PRJROOT}/build-tools下,解压
[root@skynet build-tools]# tar jxvf buildroot-0.9.27.tar.tar
[root@skynet build-tools]#cd buildroot
配置他:
[root@skynet build-tools]#make menuconfig
Target Architecture (i386) --->; 选择硬件平台,我的是i386
Build options --->; 编译选项
这个选项下重要的是(${PRJROOT}/tools) Toolchain and header file location?编译好的工具链放在哪儿?
假如您像我相同,任何工具包都在本地,不需他到网上自动下载,能够把wget command选项清空;
Toolchain Options --->; 工具链选项
--- Kernel Header Options 头文档他会自动去下载,但是应该确保和您将要用的内核是同一个版本;
[] Use the daily snapshot of uClibc? 使用最近的uClibc的snapshot
Binutils Version (binutils 2.15.91.0.2) --->; Binutils的版本
GCC compiler Version (gcc 3.4.2) --->; gcc 版本
[*] Build/install c compiler and libstdc ?
[ ] Build/install java compiler and libgcj? 支持的语言,我没有选择java
[ ] Enable ccache support? 启用ccache的支持,他用于编译时头文档的缓存处理,用他来编译程式,第一次会有点慢,但是以后的速度可就很理想了,呵呵……
--- Gdb Options 根据您的需要,选择gdb的支持
Package Selection for the target --->;
这一项我没有选择任意一项,因为我打算根文档系统及busybox 等工具链创建成工,手工来做。
Target Options --->; 文档系统类型,根据实际需要选,我用的ext2;
配置完成后,编译他:
[root@skynet build-tools]#make
这一项工作是很花时间的,我的工具包全部在本地,也花去我一小时十三分的时间,假如全要下载,我估计网速正常也要多花一两个钟头。
经过漫长的等待(事实上并不漫长,去打了几把游戏,很快过去了):
……
make[1]: Leaving directory `/home/skynet/build-tools/buildroot/build_i386/genext2fs-1.3'
touch -c /home/skynet/build-tools/buildroot/build_i386/genext2fs-1.3/genext2fs
#-@find /home/skynet/build-tools/buildroot/build_i386/root/lib -type f -name \*.so\* | xargs /home/skynet/tools/bin/i386-linux-uclibc-strip --remove-section=.comment --remove-section=.note --strip-unneeded 2>;/dev/null || true;
/home/skynet/build-tools/buildroot/build_i386/genext2fs-1.3/genext2fs -i 503 -b 1056 \
-d /home/skynet/build-tools/buildroot/build_i386/root -q -D target/default/device_table.txt /home/skynet/build-tools/buildroot/root_fs_i386.ext2
大功告成!!!
清点战利品
让我来看看他究竟做了哪些事情吧:
[root@skynet skynet]# cd tools
[root@skynet tools]# ls
bin bin-ccache i386-linux i386-linux-uclibc include info lib libexec man usr
bin:任何的编译工具,如gcc,都在这儿了,只是加了些指定的前缀;
bin-ccache:假如在Toolchain optaion中没有选择对ccache的支持,就没有这一项了;
i386-linux:链接文档;实际指向include
i386-linux-uclibc:uclibc的相关工具;
include:供交叉研发工具使用的头文档;
info:gcc 的info文档;
lib:供交叉研发工具使用的链接库文档;
……
现在能够把编译工具所在目录XXX/bin添加至PATH了
测试工具链
假如您现在写一个程式,用i386-linux-gcc来编译,运行的程式会告诉您:
./test: linked against GNU libc
因为程式运行库会寻到默认的/lib:/usr/lib上面去,而我们现在的uclibc的库并不在那里(虽然对于目标机来讲,这是没有错的),所以,也只能暂时静态编译,试试他能否工作了。当然,您也能够在建好根文档系统后,试试用chroot……
第三章 编译内核
本章的工作,是为目标机建立一个合适的内核,对于建立内核,我想有两点值得考虑的:
1、功能上的选择,应该能够满足需要的情况下,尽量地小;
2、小不是最终目的,稳定才是;
所以,最好编译内核前有一份目标机硬件平台清单连同所需功能清单,这样,才能更合理地裁减内核。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




