首页 > 代码库 > 浅析 Linux 下的 arm 交叉编译工具

浅析 Linux 下的 arm 交叉编译工具



什么是交叉编译工具



http://elinux.org/Toolchains
要解释交叉编译工具,我们首先要理解三个基本概念:
  1. 编译平台:是指该编译器是在哪个平台编译出来的
  2. 编译主机:编译器运行在哪个平台
  3. 目标平台:编译器为哪个平台产生代码
比如我们在 Ubuntu(Linux) 下编译 arm 开发板的程序,那么:
  • 编译平台就是 X86,该编译器在 x86上运行
  • 编译主机就是这台运行 Ubuntu Linux 的电脑
  • 目标平台就是 arm 开发板
所以通常所指的交叉编译,就是在该平台编译生成在另外一个平台运行代码的过程。因此在三种不同的主机上可能存在三种不同的编译工具:
  1. 本地编译工具,通常发行版 Linux 都自带的编译工具,即目标平台与编译主机一样。
  2. 交叉编译工具工具,通常指 x86上编译生成其他平台(ARM, MIPS,PowerPC )代码的工具
  3. 交叉本地编译工具,通常指 x86上编译在目标平台上运行产生目标平台代码的工具,例如在 arm 开发板上编译 arm 程序


工具链有哪些模块

工具链也是程序,也是编译生成的可执行程序,工具链一般有以下模块:

Binutils

binutils 是 GNU项目的一部分,也是编译器的第一个模块,它提供了两个非常重要的工具:

  1. as  汇编器,将汇编代码变成机器码
  2. ld   链接器,将编译生成的目标文件链接成库或者可执行文件

编译器

我们用的多的就 GNU 的 GCC


C 库

常见的 glibc


调试器

gdb


arm 编译器

http://elinux.org/ARMCompilers

GNU arm 编译器

GNU gcc 有对 arm 平台的支持,配置可以生成 arm gcc。

编译的步骤

  1. 下载 binutils
  2. 下载 gcc,不建议下载gcc-core,下载包含全部的包。
  3. 下载 c库   newlib,glibc
  4. 下载 linux内核,用gcc-core需要,下载gcc全部的包不需要,gcc全部的包,包含了头文件。建议下载gcc全部的包。
编译 gcc 网上参考资料很多,这里就不重复了,也可以参考官方编译文档,主要是配置和一些依赖。

arm-linux-gcc 和 arm-elf-gcc 的区别 

区别在于两者编译时使用的库,不一样,arm-elf-gcc 使用嵌入式精简版 c 库 -- newlib, arm-linux-gcc 使用标准 glic 。因此两者编译出来的程序大小有差别,执行也有很大的不同,例如 printf , arm-elf-gcc 直接调用 Linux 内核 syscall, arm-linux-gcc 就是采用 glibc 里面标准 C 打印函数了。
所以,编译内核应该使用 arm-elf-gcc, 编译应用程序应该使用 arm-linux-gcc