6SE6430-2AD27-5CA0
6SE6430-2AD27-5CA0 自己制作交叉编译器
早期(2009年以前)我们在做嵌入式系统开发时,第一件事就是自己制作交叉编译器。当时做交叉编译器 需要自己下载gcc、glibc、binutils等相关工具的源码,然后一个一个源码编译安装。制作交叉编译器的 过程中最痛苦的莫过于各个软件之间的版本依赖关系,如gcc 4.6.2 依赖 glibc 2.13,如果你选定 gcc 4.7 则可能编译制作失败,然后再尝试一个新的版本重新编译,直至找到一个合适的版本为止。
后来为了方便交叉编译器的制作,有很多组织或个人开始编写这些制作交叉编译器的脚本或框架,并测 试解决这些软件版本之间的依赖关系。当时最知名的莫过于基于 glibc 的 crosstool 和 基于 uclibc 的
buildroot 了。在开始讲解如何制作交叉编译器之前,我们首先来了解一下 C运行库。
1.嵌入式C运行库
1.1glibc库
glibc是gnu发布的libc库,也即c运行库。glibc是linux 系统中层的api(应用程序开发接口),几乎其它任何的运行库都会倚赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了 许多其它一些必要功能服务的实现,主要的如下:
b,字符串处理
signal,信号处理
dlfcn,管理共享库的动态加载
direct,文件目录操作
elf,共享库的动态加载器,也即interpreter
iconv,不同字符集的编码转换
inet,socket接口的实现
intl,国际化,也即gettext的实现
io
linuxthreads
locale,本地化
login,虚拟终端设备的管理,及系统的安全访问
malloc,动态内存的分配与管理
nis
stdlib,其它基本功能
gcc 是编译器,基本上 Linux 下所有的程序(包括内核)都是 gcc 编译的,libc 当然也是。gcc 和 libc 是互相依赖的两个软件,它们合作的方式类似 Linux 系统的 "自举"。先在一个可以运行的带有老 libc 和
gcc 的系统上,用老 gcc 编译出一个新版本的 gcc + 老 libc,再用这个新 gcc 编译出一个新 gcc + 新
libc,再用这套新的组合编译整个新系统。
1.2 uClibc库
PC上常用的标准库glibc是一个非常宠大而完整的库,但早期对于嵌入式系统来说,由于Flash和RAM的 存储空间有线,其体积显得过于大了一些。uClibc的出现就是为了解决这个问题,uClibc尽可能的兼容
Glibc,大多数应用程序可以在很小或完全不修改的情况下就可能使用uClibc替代glibc。通过uClibc来代 替Glibc,可以在不改变应用程序功能的前提下,大大减少发布文件的大小,无论应用程序以静态链接来 编译,还是以动态链接形式编译。
6SE6430-2AD27-5CA0