ABI:Application Binary Interface应用程序二进制接口。
每个操作系统都会为运行在该系统下的应用程序提供ABI。ABI包含了应用程序在这个系统下运行时必须遵守的编程约定。ABI总是包含一系列的系统调用和使用这些系统调用的方法,以及关于程序可以使用的内存地址和使用机器寄存器的规定。
从一个应用程序的角度看,ABI既是系统架构的一部分也是硬件体系结构的重点,因此只要违反二者之一的条件约束就会导致程序出现严重错误。在很多情况下,链接器为了遵守ABI的约定需要进行一些重要的工作。例如,ABI要求每个应用程序包含一个该程序中各例程使用的所有静态数据的地址表,链接器通常会通过收集所有链接到程序中的模块的地址信息来创建这个表。ABI经常会影响链接器的是对标准过程调用的定义。
我的理解:一般应用程序最终都是以可执行文件存在的(如win下的exe文件,Linux下的elf文件),ABI即是对这些文件的抽象,一般包括了一个文件内部应该有什么样的组织格式,各个segment的定义等,只有符合这个ABI标准的二进制文件才能够被相应的OS加载并执行之。complier和linker做的工作就是为了符合这个标准,链接脚本就是其中的一小部分,如
linux上gcc的链接器ld的默认链接脚本lds(可以通过命令ld --verbose 打开),MTK中mcu/custom/system/proj_BB目录下的scattfile scatxxx.txt,另外OS有相应的loader(加载器)来load二进制文件。
Ref:http://en.wikipedia.org/wiki/Application_binary_interface