交叉编译

来源:互联网 发布:淘宝宝贝评论保留多久 编辑:程序博客网 时间:2024/05/29 19:02

交叉编译简介
英文原文
交叉编译基本概念

1.本地编译
在当前编译平台编译出来的程序,只能在当前平台运行的,成为本地编译。
如:使用x86平台上的工具,编译出能在x86平台上使用的程序,这个编译过程称为本地编译。
2.交叉编译
在当前平台上编译能在目标平台上运行,但是不能在本平台运行的程序的编译过程成为交叉编译。

为什么需要交叉编译:
平台的差异是交叉编译存在的根本原因。
交叉编译出来的程序,所要运行的目标环境中,各种资源,都相对有限,所以很难进行直接的本地编译。
主要体现在:
(1)运行速度
(2)内存和磁盘资源
(3)一个完整编译环境需要很多支持包,可以避免在目标平台移植。
(4)目标平台运行的本地编译器,总需要通过交叉编译获得

3.交叉编译难点

(1)不同体系架构带来的不同机器特性
Word size: 是64位还是32位系统
Endianness: 是大端还是小端系统
Alignment: 是否必修按照4字节对齐方式进行访问
Default signedness: 默认数据类型是有符号还是无符号
NOMMU: 是否支持MMU
(2)交叉编译时主机环境与目标环境的差异
Configuration issues:
配置参数
HOSTCC vs TARGETCC:
主机端和目标端编译器
Toolchain Leaks:
配置不当造成的工具链泄露
Libraries:库
Testing:
4.交叉编译流程
交叉编译示意图

交叉编译链就是为了编译跨平台体系结构的程序代码而形成的由多个子工具构成的一套完整的工具集。同时,它隐藏了预处理、编译、汇编、链接等细节,当我们指定了源文件(.c)时,它会自动按照编译流程调用不同的子工具,自动生成最终的二进制程序映像(.bin)。

5.交叉编译链的命名规则

arm-none-linux-gnueabi-gccarm-cortex_a8-linux-gnueabi-gccmips-malta-linux-gnu-gcc

如上是常见的交叉编译链。有一定的命名规则,但不是完全一致。

arch: 目标平台。core: 使用的是哪个CPU Core,如Cortex A8,但是这一组命名好像比较灵活,在其它厂家提供的交叉编译链中,有以厂家名称命名的,也有以开发板命名的,或者直接是none或cross的。kernel: 所运行的OS,见过的有Linux,uclinux,bare(无OS)。systen:交叉编译链所选择的库函数和目标映像的规范,如gnu,gnueabi等。其中gnu等价于glibc+oabi;gnueabi等价于glibc+eabi。gcc:编译器

6.常用交叉编译链工具
A.Binutils
Binutils是GNU工具之一,它包括链接器、汇编器和其他用于目标文件和档案的工具,它是二进制代码的处理维护工具
Binutils工具包含的子程序如下:
ld GNU连接器the GNU linker.
as GNU汇编器the GNU assembler.
addr2line 把地址转换成文件名和所在的行数
ar A utility for creating, modifying and extracting from archives.
c++filt Filter to demangle encoded C++ symbols.
dlltool Creates files for building and using DLLs.
gold A new, faster, ELF only linker, still in beta test.
gprof Displays profiling information.
nlmconv Converts object code into an NLM.
nm Lists symbols from object files.
objcopy Copys and translates object files.
objdump Displays information from object files.
ranlib Generates an index to the contents of an archive.
readelf Displays information from any ELF format object file.
size Lists the section sizes of an object or archive file.
strings Lists printable strings from files.
strip Discards symbols
B.GCC
GNU编译器套件,支持C, C++, Java, Ada, Fortran, Objective-C等众多语言。
C.GLibc
Linux上通常使用的C函数库为glibc。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。
D.GDB
GDB用于调试程序