1.为什么需要“选择”编译工具链?
工具链的作用之一是将.c .h等等源文件翻译成机器指令,机器指令与硬件架构、操作系统密切相关,所以选择一个与目标平台相符的编译工具链就很重要。
当我们在为某个平台编译u-boot、内核、驱动、应用等等时,做的第一件事情就是配置一个适合这个平台的编译工具链。
例如:
将工具链所在路径加入PATH环境变量
ARCH=arm
CROSS_COMPILE=arm-linux-gnueab
选择什么样的工具链取决于你即将编译的程序是运行在哪种平台上(操作系统+CPU架构=平台),例如我需要为一个运行着linux操作系统的s5pv210编译一个打印“hello wordl”的程序。
这时可以根据上述信息选择编译工具链,s5pv210对应arm 32位架构,linux对应到运行环境为linux,即可选用arm-none-linux-gnueabi工具链。
2.工具链的命名规则
[arch]- [vendor]-[os]-[bi(eabi/abi)]-[gxx]
[]中的内容表示可选项
arch:代表架构,如arm、mips等等
vendor:代表提供工具链的厂商
os:表示目标操作系统,如果给裸机可选择linux加上-static静态链接,不使用动态库,将要用到的库全部编译到可执行文件中,或者选用一个none的也可以,这时很灵活的,可以自己分辨
bi:代表二进制程序接口,例如针对嵌入式平台选择eabi
gxx:可选择使用gcc、g++、ld等等工具ABI与EABI的区别
这部分定义了
数据类型在内存中的布局方式(数据大小/对齐方式)
嵌套函数调用的工作方式
程序启动/初始化如何工作
ABI全称Application Binary Interface 应用程序二进制接口,可理解为应用程序和操作系统之间的接口,适用于x86/x64。
EABI全程Embedded Binary Interface 嵌入式二进制接口,适用于嵌入式的二进制程序接口。实例
arm-none-eabi-gcc:该工具链用于arm架构,适用于裸机系统,嵌入式平台,用于编译c语言文件。因未指定操作系统,不适用linux系统(不支持编译使用了linux相关c库API的程序,例如含有fork函数)。
arm-none-linux-gnueabi-gcc:该工具链用于arm架构,适用于Linux系统,嵌入式平台,用于编译c语言文件。可编译u-boot、linux内核、适用于arm的linux程序等
关于某个工具链的详细特性可以查阅该工具链的参考手册。