缔造程序兼容的契约(ABI)

缔造程序兼容的契约(ABI)

1. API是什么?

ABI(application binary interface),指的时应用程序二进制接口。
EABI(embeded application binary interface),指的是嵌入式应用程序二进制接口,和ABI的区别在于应用程序中允许使用特权指令。
ABI广义上的概率指的是应用程序在二进制层面的规范,狭义上指的是某个硬件/操作系统/虚拟机平台的规范文档。

2.ABI和 API的区别:

ABI是二进制层面的规范,而API是源码层面的规范。两者没有直接联系。
遵循相同ABI的系统,所提供的API可能不同:
相同的不同的系统如Windows和Linux都可以在电脑上安装,原因是遵循了相同的ABI规范,但是源代码是不同的,原因API不同。
遵循相同API的系统,所提供的ABI可能不同:
QT应用程序开发后(API相同,源代码),可以在Windows和Linux上运行,单经过编译后的可执行文件不同(编译时遵循的ABI不同)
Java跨平台原理:
编译之后的二进制文件相同,通过运行在不同平台上java虚拟机将其翻译成对应平台的可执行程序(翻译的规则是平台的ABI规范)。

QT跨平台的原理:
相同的源代码(api),,通过在不同品台编译后成为各个品台的可执行程序(编译规范遵守了平台的ABI规范)。

3. API有什么?

3.1 定义了基础数据类型的大小


从这个角度考虑程序的可移植性,只需要将类型适配层做相应修改,使得数据类型满足平台规范即可。

3.2 定义了共用体/结构体的对齐方式

如下面的程序,有两种对其方式,在Linux中使用的是压缩存储。

struct {
    short s : 9;
    int j : 9;
    char c;
    short t : 9;
    short u : 9;
    char d;
} s;

Linux下输出结果:

3.3 定义了硬件寄存器的使用方式

寄存器时处理器用来处理数据的载体,一些寄存器在处理器设计时就规定好了功能。

X86寄存器的ABI规范:

Power PC寄存器的ABI规范

3.4 定义了函数的调用时的约定

当函数调用时,参数会被传递给被调用的函数,而返回值会被返回给函数调用者。
调用约定描述参数如何传递到栈中以及栈的维护方式:参数的传递顺序(如从左向右入栈)、调用栈的清理(如被调函数负责清理栈)。
调用约定通常用于调用和库开发:

原文地址:http://blog.51cto.com/11134889/2092884

时间: 2024-11-03 01:45:42

缔造程序兼容的契约(ABI)的相关文章

第15课 缔造程序兼容的合约(下)

1. ABI规定桢栈结构 (1)栈帧的内存布局(以Linux为例) (2)栈帧的形成方式 (3)栈帧的销毁方式 2. ebp寄存器 (1)ebp为当前栈帧的基准(存储上一个栈帧的ebp值) (2)通过ebp能够获取返回值地址.参数和局部变量等. 3. 函数调用发生时的细节 (1)调用者通过call指令调用函数,将返回地址压入栈中 (2)函数所需要的栈空间大小由编译器确定,表现为字面常量 (3)函数结束时,leave指令恢复上一个栈帧的esp和ebp(mov ebp, esp; pop ebp)

windows10下安装Microsoft Visual Studio 2013.4 Community enu中文语言包出错,提示“”程序兼容模式已打开.请将其关闭”的解决方法

原来win8系统用着有点慢,就选择重新安装系统,安装了win10预览版,感觉确实很不一样,呵呵.在安装了vs2013社区版后,默认是英文版的,因为英文不太好,需要安装简体中文语言包,但是安装时一直报“程序兼容模式已打开,请将其关闭然后重新运行安装程序”, 在使用兼容win8模式安装后仍然提示这个,郁闷了好几天,后来在网上找到一个解决办法,记录如下: 使用命令提示符打开vs_langpack.exe,在后面添加 /Uninstall,类似这样D:\tools\vslang>vs_langpack.

怎样让ABBYY FineReader与其它应用程序兼容使用

ABBYY FineReader 12支持与 Microsoft Office 应用程序和 Windows 资源管理器进行集成.可以帮助大家在使用 Microsoft Outlook.Microsoft Word.Microsoft Excel 和 Windows 资源管理器时识别文档,那么ABBYY FineReader12到底是怎么和这些应用程序兼容使用的呢? 若有疑问可直接访问:http://www.abbyychina.com/FRshiyongjiqiao/fr-chengxu-jic

Windows7,程序兼容助手:这个程序可能安装不正确(做注册表里设置白名单,软件自身的名字不能带setup)

Windows上有一个很奇怪的一个现象,一个exe只要名字里面带了setup\install之类的,打开exe后立即退出就会弹出下面的窗口. 解决方法: 方法一.更改exe的名字,去掉setup\install,即使是资源文件rc中的setup\install也要去掉. 方法二.在main函数入口处调用下面的函数,将当前exe写入Windows的“注册表白名单”中去,关闭时Windows就不会弹出兼容助手了. [cpp] view plain copy bool RegWritePca() {

安装Visual Studio 语言包时出现windows 程序兼容模式已打开.请将其关闭

打开 cmd.exe 输入 安装包路径 /Uninstall例如:D:\vs_lang_cn.exe /Uninstall (中间有个空格,Uninstall前是个左斜杠)回车 后 安装包会运行.点击 修复 .OK 等待,安装进行中... 如下图:

Linux程序包管理与初识磁盘

Linux 程序包管理 API:Application Binary Interface(应用程序的二进制接口) ABI:APPlication Program Inertface(应用程序的开发接口) Windows : exe,msi Windows与Linux不兼容 ELF:(Executale and Linkable Format):可执行可连接格式,linux运行格式 PE:(Portable  Executable)可移植可执格式Windows运行格式 库级别的虚拟化: 要想在Wi

谢烟客---------Linux之程序包管理基础知识

内核不提供特定的功能:功能由程序提供 程序的格式,ABI Windows:EXE Linux:ELF 程序编译的过程: 源程序 --> 编译 --> 汇编代码 --> 汇编 --> 二进制程序 --> 链接 编译的分类: 静态编译: 将程序运行时依赖的库编译进程序 动态编译:编译后需要链接库,在程序运行时,依据链接找到共享的库 程序跨平台运行 1.库虚拟化,虚拟出对应平台的库和ABI;程序运行在库之上 1).Linux上运行WINE程序,即可虚拟出Linux程序运行所依赖的库

Linux程序包管理之rpm包管理

Linux程序包管理 软件包管理 功能:将编译好的程序的各组成文件打包成一个或几个程序包文件,为了方便的实现程序包的安装.升级.卸载.查询.校验.数据库维护. API:Application ProgramInterface应用程序接口: ABI:Application BinaryInterface应用二进制接口: Unix-like和linux在ABI层次是相同的 linux程序包:ELF格式: 但是与Windows相差甚远 windows程序包:exe,msi格式: API层次兼容不一定A

Linux程序管理之rpm,yum,编译安装详解

操作系统:CentOS 6.7 内核版本:2.6.32-573.el6.x86_64 程序编译概念 程序要在机器上运行,就需要编译,编译针对特定的OS平台和硬件平台,编译后的程序只能运行在特定的软硬平台上  交叉编译:        在测试机上针对其他平台进行程序编译 编译过程:        预编译 -> 编译 -> 汇编 -> 链接            链接:生成库调用的头文件            静态链接:程序文件本身集成所需调用的库文件            动态链接:调用标