要做嵌入式Linux开发,首先需要有交叉编译工具链(cross compiling toolchain),也就是在主机(x86 PC)上可编译生成目标板可执行文件(ARM指令)的编译工具。和普通的编译工具链一样,交叉编译工具链也包括编译、链接、修改目标文件的各种程序,如gcc、glibc、ld、gas、objdump、readelf等等。交叉编译工具链本身也是需要编译生成的,要得到一套完整的交叉编译工具链需要编译以下源码包:
1. binutils
2. gcc
3. glibc
4. linux(内核)
5. linux-libc-headers
6. glibc-linuxthreads
这些源码包具有非常强的版本依赖关系,如果源码包的版本不匹配,在编译过程中会出现各种各样的问题,有些问题需要对源码做些修改或者打补丁,有些问题则是没有解决办法的。所以源码包的版本要非常匹配,必要时要对源码做适当的修改。编译的步骤也是比较复杂的,主要有以下几步[1]。
1.根据目标平台配置内核源代码,生成内核头文件
2.编译binutils
3.编译器的自举(bootstrap),也就是先编译出gcc的部分功能(没有glibc支持,只有C编译器没有C++编译器)
4.编译glibc
5.编译完整的gcc
幸运的是,已经有人写出了制作交叉编译器的脚本( http://www.kegel.com/crosstool),该脚本中提供了一系列源码包版本的匹配方案,使用者需要选择目标平台和源码包的版本匹配方案(比如笔者选择通用arm平台gcc-4.0.2-glibc-2.3.6),执行该脚本会自动从官方网站(http://www.gnu.org和 http://www.kernel.org)下载源代码然后自动完成所有的编译步骤。
注意 笔者在Ubuntu系统上执行该脚本,到编译glibc时出错,经查原因是glibc中的脚本有不符合POSIX标准的用法。用bash执行该脚本是没问题的,但Ubuntu系统的/bin/sh默认是指向dash的,dash没有bash那样丰富的交互功能,但是执行脚本时非常高效并且其实现完全遵守POSIX标准,然而现存的很多脚本有不符合POSIX标准的用法,解决的办法是把/bin/sh重新指向bash。
此外,网上也可下载到已编译好的交叉编译工具链,比如 http://www.snapgear.org/snapgear/downloads.html,但是使用别人编译好的交叉编译工具链有很多限制,不能按自己的特殊需要对其定制,比如需要soft-float的编译器(生成指令模拟浮点数运算)。
笔者的编译器是安装在/usr/local/arm-linux/下的,程序文件名前缀是arm-linux-,也就是arm-linux-gcc、arm-linux-ld、arm-linux-readelf等等,需要设置PATH环境变量使系统能找到这些程序。
http://qgjie456.blog.163.com/blog/static/354513672007624901820/