终于把交叉编译环境、移植内核和制作root文件系统在arm开发板上顺利跑通了。期间有的步骤很顺利,更多的是被很多细节性的问题困住,比如最后一个不起眼的小问题导致文件系统无法加载,困扰了我一个星期,最终通过分析慢慢发现了这个bug。还有各源码包版本的问题,而且网上很多介绍都是基于旧版本的。我这里全部用我能找到的最新版本,当然,至于新旧版本到底哪个更好更合适,这是个智者见智的论题,不在本文讨论之列。我坚信很多人也遇到过或者即将遇到类似的错误和问题,因此我觉得把我过去两周做过的相关工作,详细地写下来,希望对大家有所帮助!
首先是平台和环境 ,我过去两周都是基于vmware 中Ubuntu 10.04的,但是我发现Ubuntu这个很火的桌面linux发行版本并不适合进行嵌入式开发,典型的麻烦就是系统缺少很多库、服务等等,需要自己手动安装,增加了不少额外的工作,和我以前用的Fedora 9比麻烦不少。所以现在我干脆全新装了一个Fedora 13 ,把过去的工作重复一遍,边编译边纪录,力求不遗漏细节!
过程预览:
1,准备工作,包括下载源码包、补丁、建立文件夹和设置环境变量等
2,建立内核头文件
3,建立binutils
4,建立bootstrap gcc
5,建立glibc
6,建立完整版本gcc
7,测试hello world
现在就让我们开始吧!
1,准备工作
我使用的源码包和补丁 如下:
linux-2.6.34.tar.bz2
binutils-2.20.tar.gz
gcc-4.5.0.tar.bz2
gcc-4.5.0-startfiles_fix-1.patch
gmp-4.3.0.tar.bz2
mpc-0.8.2.tar.gz
mpfr-3.0.0.tar.bz2
glibc-2.11.tar.gz
glibc-linuxthreads-2.5.tar.bz2
glibc-ports-2.11.tar.bz2
glibc-2.11.2-gcc_fix-1.patch
至于怎么得到这些源码包,找google吧!
建立工作目录:
自己选一个合适的地方,建立一个总文件夹Embedded,并且在其下建立 build-tools、kernel和tools三个子文件夹、我们以后的操作就都在这里进行了。
$ mkdir Embedded
$ cd Embedded
$ mkdir build-tools kernel tool
$ ls
build-tools kernel tool
各文件夹作用如下:
build-tools : 保存binutils、gcc 和 glibc的源代码和用来编译这些源代码的目录。
kernel : 保存内核源代码和补丁。
tools : 保存编译好的交叉编译工具和库文件。
设置环境变量:
这里设置环境变量只是为了方便,因为每个工具的config都需要输入类似的变量,不如放在环境变量里。
在命令行下打开vi ~/.bashrc,在文档最后输入下面几行,然后注销当前用户,重新登录
export PRJROOT=/home/jinglelong/MySoftware/Embedded
export TARGET=arm-linux
export PREFIX=$PRJROOT/tools
export TARGET_PREFIX=$PREFIX/$TARGET
export PATH=$PREFIX/bin:$PATH
各变量的具体意义如下:
PRJROOT : 整个工程的根目录,这里当然是Embeded了
TARGET : 目标文件对应的体系结构,arm-linux代表编译出来的target只能在arm体系结构中运行
PREFIX : 设置目标文件夹的路径前缀
TARGET_PREFIX : 设置目标文件夹的路径前缀路径
PATH : 添加可执行文件的路径,这里主要是只中间编译工具等