浅析 Linux 下的 arm 交叉编译工具
时间:2014-05-15 22:53:32
收藏:0
阅读:554
什么是交叉编译工具
要解释交叉编译工具,我们首先要理解三个基本概念:
- 编译平台:是指该编译器是在哪个平台编译出来的
- 编译主机:编译器运行在哪个平台
- 目标平台:编译器为哪个平台产生代码
比如我们在 Ubuntu(Linux) 下编译 arm 开发板的程序,那么:
- 编译平台就是 X86,该编译器在 x86上运行
- 编译主机就是这台运行 Ubuntu Linux 的电脑
- 目标平台就是 arm 开发板
所以通常所指的交叉编译,就是在该平台编译生成在另外一个平台运行代码的过程。因此在三种不同的主机上可能存在三种不同的编译工具:
- 本地编译工具,通常发行版 Linux 都自带的编译工具,即目标平台与编译主机一样。
- 交叉编译工具工具,通常指 x86上编译生成其他平台(ARM, MIPS,PowerPC )代码的工具
- 交叉本地编译工具,通常指 x86上编译在目标平台上运行产生目标平台代码的工具,例如在 arm 开发板上编译 arm 程序
工具链有哪些模块
工具链也是程序,也是编译生成的可执行程序,工具链一般有以下模块:
Binutils
binutils 是 GNU项目的一部分,也是编译器的第一个模块,它提供了两个非常重要的工具:
- as 汇编器,将汇编代码变成机器码
- ld 链接器,将编译生成的目标文件链接成库或者可执行文件
编译器
我们用的多的就 GNU 的 GCC
C 库
常见的 glibc
调试器
gdb
arm 编译器
GNU arm 编译器
GNU gcc 有对 arm 平台的支持,配置可以生成 arm gcc。
编译的步骤
- 下载 binutils
- 下载 gcc,不建议下载gcc-core,下载包含全部的包。
- 下载 c库 newlib,glibc
- 下载 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
评论(0)