DIY 自己的GNU 交叉工具链(i386-arm) 嵌入式设备由于不具备一定的处理器能力和存储空间,程序开发一般用PC 来完成,然后将可执行文件下载到嵌入式系统中运行。这是目前嵌入式程序开发的不二选择——Host/target 模式。但这引发了一个问题:由于Host 和Target 的处理器体系结构不同,我们不能直接用PC 上既有的程序开发工具,必须使用跨平台开发工具,即在Host 上生成能在Target 上运行格式的目标文件。 与在PC 上进行程序开发类似,嵌入式系统开发也需要编译器、链接器、解释程序等。本文讨论 GNU 跨平台开发工具链的建立,包括: ld, gas, ar, gcc, glibc. 自己建立交叉编译环境是一件很头疼的事(处理版本的依赖性, 漫长的编译过程...),如果你不想经历这样的痛苦,可以选择网上编译好了的工具链进行安装.如果你用的是Debian/Ubuntu 的发行版, 推荐使用Emdebian. 如果使用uClinux, 也可安装 arm-elf-tools. 关于Emdebian 和arm-elf-tools 的更多介绍, 情看本 blog 的这篇文章! 前提: 建立工作目录 在为目标板开发及定制软件的过程中, 最好将项目要用到的代码, 文档, 及生成的目标文件按一定的组织放在统一的, 结构化的目录中. 这里采用《构建嵌入式Linux 系统》中推荐的项目目录安排: 目录 内容 bootldr 目标板的引导加载程序 build-tools 建立跨平台开发工具链所需要用到的包和目录 debug 调试工具及相关包 doc 项目相关的文档 images 使用在目标板上的引导加载程序和内核的二进制映像, 以及根文件系统 kernel 将在目标板上进行评估的各个内核版本 rootfs 目标板的内核在运行时看到的根文件系统 sysapps 目标板需要用到的系统应用程序 tmp 进行实验时或临时文件会用到此目录 tools 放置跨平台开发工具链以及 C 链接库 上表列出的是一个完备的目录结构, 使用于一个实际的项目. 本文关注的是建立跨平台工具链, 它使用下面的目录: build-tools, tools, kernel 其中, 在build-tools 建立下列目录: $ mkdir build-binutils build-boot-gcc build-gcc build-glibc gcc-patch 设置环境变量 前面建立的项目空间目录众多, 我们可以设置一些环境变量以方便后面的工作. 你可以在命令行中设定这些环境变量. 当然, 更简单的方法是建立一个名为 RunFirst.sh 的bash 脚本. 将该脚本放在项目根目录中, 每次登录时运行它既可进入你的工作环境: $ ./RunFirst.sh #...