1. 相关概念
定义
在当前编译平台下,编译出来的程序能运行在体系结构不同的另一种目标平台上,但是编译平台本身却不能运行该程序,如下图所示。
解决的问题
- Speed
目标平台的运行速度往往比主机慢得多,许多专用的嵌入式硬件被设计为低成本和低功耗,没有太高的性能 - Capability
整个编译过程是非常消耗资源的,嵌入式系统往往没有足够的内存或磁盘空间 - Availability
即使目标平台资源很充足,可以本地编译,但是第一个在目标平台上运行的本地编译器总需要通过交叉编译获得 - Flexibility
一个完整的Linux编译环境需要很多支持包,交叉编译使我们不需要花时间将各种支持包移植到目标板上
难点
1)不同的体系架构拥有不同的机器特性
- Word Size:32-bit 还是 64-bit
- Endianness:是大端系统还是小端系统
- Alignment:是否必须按照4字节对齐方式进行访问
- Default Signedness:默认数据类型是否有符号
- NOMMU:是否支持MMU
2)交叉编译时的主机环境与目标环境不同
Configuration Issues, HOSTCC vs TARGETCC, Toolchain Leaks, Libraries, Testing
2. 交叉编译流程
编译过程是按照不同的子功能,依照先后顺序组成的一个复杂的流程,如下图所示。
编译过程主要包括了四大功能:预处理、编译、汇编和链接。
- 预处理(Preprocessing):将每个源文件所需要的代码都放在自己文件里,然后方便下一步处理;
- 编译(Compilation):把C/C++代码翻译成汇编代码,能够有效地减弱编译器编写的复杂性,并方便后续的优化与调试;
- 汇编(Assembly):利用汇编器将第二步输出的汇编代码翻译成符合一定格式的机器代码;
- 链接(Linking):将汇编生成的OBJ文件、系统库的OBJ文件、库文件链接起来,即将各个ELF文件重新排序成一个ELF文件,最终生成可以在特定平台运行的可执行程序。
3. 交叉编译链命名格式
arch-core-kernel-system
arch:目标平台
core:使用的CPU Core
kernel:所运行的操作系统
system:交叉编译链所选择的库函数和目标映像的规范