文章目录

  • 1.ABI 简介
  • 2.API 简介
  • 3.ABI 与 API 的区别

1.ABI 简介

C++ 可执行文件是由编译器将源代码编译成目标文件后链接生成的,那么如果目标文件由不同的编译器编译生成,能否相互链接呢?例如,能够将 MSVC 编译出来的目标文件和GCC编译出来的目标文件链接到一起,生成一个可执行文件吗?

对于上面这个问题,如果链接器可以将 MSVC 编译出来的目标文件和 GCC 编译出来的目标文件链接到一起,那么链接器首先需要支持 MSVC 编译生成的目标文件的格式 PE/COFF 和 GCC 的 ELF 格式。此外,不同格式的目标文件需要拥有相同的符号修饰标准、变量内存分布方式、函数调用方式等等。其中目标文件格式、符号修饰标准、变量内存分布方式、函数调用方式等这些跟二进制可执行代码兼容性相关的内容称为 ABI。

ABI(Application Binary Interface)为应用程序二进制接口,描述了应用程序和操作系统之间,一个应用和它的库之间,或者应用的组成部分之间的二进制层面的底层接口。影响 ABI 的因素非常多,硬件、编程语言、编译器、链接器、操作系统等都会影响 ABI。我们以 C 语言为例,来看编程语言是如何影响 ABI 的。对于 C 语言的目标代码来说,以下几个方面会决定目标文件之间是否二进制兼容:
(1)内置数据类型(如 char、int、float 等)的大小和在存储器中的存放方式(大端、小端、对齐方式等);
(2)组合数据类型(struct、union 等)的存储方式和内存分布;
(3)外部符号和用户定义的符号之间的命名方式和解析方式。比如函数名func在C语言目标文件中是否会被解析成外部符号_func;
(4)函数调用方式,比如参数入栈顺序、返回值如何保存等;
(5)函数栈的分布方式,比如参数和局部变量在堆栈里的位置,参数传递方法等;
(6)寄存器使用约定,函数调用时哪些寄存器可以修改,哪些需要保存等。

以上只是部分因素会影响到ABI,其它的不再一一列举。到了 C++,语言层面对 ABI 的影响又增加了许多额外的内容,可见,这些内容使得 C++ 做到二进制兼容比C更加困难。增加的内容有:
(1)继承体系下的对象内存布局,比如基类、虚基类在继承类中的位置;
(2)指向类成员函数的指针(Pointer to Member)的内存分,如何通过指向成员函数的指针调用成员函数,如何传递this指针;
(3)如何调用虚函数,虚函数表的内容和分布形式,虚函数表指针在对象中的位置等;
(4)template如何实例化;
(5)外部符号的修饰;
(6)全局对象的构造和析构;
(7)异常的产生和捕获机制;
(8)标准库的细节问题、RTTI如何实现等;
(9)内联函数访问细节。

C++ 新增的内容包括但限于以上内容,对 ABI 的兼容带了极大的挑战,C++ 二进制兼容性不够友好也一直为人诟病。不仅不同编译器编译的二进制代码之间无法相互兼容,有时候连同一个编译器的不同版本之间的兼容性也不好。比如开发团队 A 开发了一个使用 CompilerA 版本的编译器编译的库 libA.a,开发团队 B 开发了一个使用 CompilerB 版本编译器编译的库 libB.a,开发团队 C 想将库 libA.a 和库 libB.a 链接到程序 Program C中,可能会出现不兼容的情况。

事实上 C++ ABI 尚未统一,目前兼容情况仍不乐观,主要有两套体系,一是微软 Visual C++ 使用的标准,另一个是GNU GCC 使用的标准,二者互不兼容。

2.API 简介

API(Application Programming Interface)是应用程序编程接口,是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需了解源码和内部实现细节。比如,POSIX 标准,C99 标准等都是对 API 的规定。其中,POSIX 标准是不同操作系统间的 API 标准,POSIX 标准定义了类 Unix 操作系统应该为应用程序提供的接口。C99 标准则规定了 C 语言所需提供的库函数。

API 是一种源代码级别的接口,同一个 API,在不同平台(不同操作系统或硬件平台)的具体实现方式可能不同,但是接口的形式和功能必须一致,这样就能够保证使用统一的接口实现跨平台开发。如果 API 不兼容,那么开发出来的程序换一个环境将无法运行,即出现不兼容的情况。比如 POSIX 规定 printf() 原型必须统一,不同平台间的功能也需要是相同的,即向标准输出格式化输出用户指定的内容,这样就能保证应用程序在使用 printf() 后,在不同平台可以正确运行。

3.ABI 与 API 的区别

通过上面的介绍,可以知道 ABI 和 API 是两种完全不同的东西。二者的区别可总结概括为如下几点:

  • 描述的内容不同。ABI 规定了二进制文件的格式、内容、装载/卸载程序的要求、函数调用时的参数传递规则、寄存器、堆栈的使用;API 规定操作系统、硬件平台、服务组件、语言函数库等需要提供的功能函数接口;

  • 作用的层面不同。ABI描述二进制层面的接口,API描述代码级层面的接口;

  • 兼容的难度不同。ABI的兼容程度比API更为严格,即ABI实现兼容更加困难。

引用文章:ABI 与 API 的区别

ABI 与 API 的区别(应用程序二进制接口、应用程序编程接口)相关推荐

  1. ABI 与 API 的区别

    文章目录 1.ABI 简介 2.API 简介 3.ABI 与 API 的区别 参考文献 1.ABI 简介 C++ 可执行文件是由编译器将源代码编译成目标文件后链接生成的,那么如果目标文件由不同的编译器 ...

  2. ABI (应用程序二进制接口)

    http://baike.baidu.com/link?url=ybErtZo0zAB5_P-kKZmT_nd9FdxaAAPqW4jqtwN5Tmu_q8weayOOFOJBrXw1RLbR20sK ...

  3. API、ABI究竟有什么区别?

    转载自:https://blog.csdn.net/xinghun_4/article/details/7905298 API(application programming interface):应 ...

  4. api网关和esb区别_具有ESB,API管理和Now .. Service Mesh的应用程序网络功能。

    api网关和esb区别 我最近谈论了微服务模式的演变,以及来自Lyft的Envoy之类的服务代理如何帮助将弹性,服务发现,路由,指标收集等责任推到应用程序下一层. 否则,我们冒着希望并祈祷各种应用程序 ...

  5. PowerPC构架应用程序二进制接口(ABI)及堆栈帧详解

    第一部分 概述 应用程序二进制接口(ABI-Application Binary Interface)定义了一组在PowerPC系统软件上编译应用程序所需要遵循的一套规则.主要包括基本数据类型,通用寄 ...

  6. linux关于界面的API,linux系统基础知识(ABI和API)

    对于linux而言,我们首先要明确一个核心观念,linux从严格意义上来讲,就是一个内核(Kernel)这个内核就是位于计算机硬件之上,对于用户来说,我们要和计算机打交道,必须要通过CPU来分配指令, ...

  7. c运行库、c标准库、windows API的区别和联系

    c运行库.c标准库.windows API的区别和联系 C运行时库函数 C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的.    API函数 API函数是操作系统为方便用户设计应用 ...

  8. 【软件开发底层知识修炼】二十六 ABI-应用程序二进制接口 学习总结文章目录

    前面学习了ABI的知识,感觉受益良多.对底层与编译器有更加深刻的认识,为此这里将前面写过的关于ABI 的文章给列出来,方便学习与翻阅. [软件开发底层知识修炼]二十一 ABI-应用程序二进制接口一 [ ...

  9. 【软件开发底层知识修炼】二十三 ABI-应用程序二进制接口三之深入理解函数栈帧的形成与摧毁

    上两篇文章我们初步接触了ABI-应用程序二进制接口的概念,点击链接查看上一篇文章:[软件开发底层知识修炼]二十二 ABI-应用程序二进制接口 二.了解了为什么会有ABI的存在.本篇文章继续学习ABI ...

最新文章

  1. 继续上次WDS部署安装未在真机上面实现问题解答
  2. 池化层的back proporgation 原理
  3. 太赞了!谷歌、DeepMind提出高效Transformer评估基准
  4. insertAdjacentHTML方法:在指定的地方插入html标签语句
  5. 3-16Pytorch与随机抽样
  6. sh mysql configure_【翻译自mos文章】使用config.sh/config.bat来configureorre-con
  7. ASP.NET编译和部署模型
  8. android中webview的实现
  9. log4j+flume+HDFS实现日志存储
  10. 用原生javascript制作日历
  11. ark服务器修改龙属性代码,方舟生存进化修改恐龙颜色指令代码
  12. 二、逻辑回归LR面试题总结
  13. 浪潮nf5280m5默认ipmi_NF5180M5- IPMI设置
  14. docker仓库的搭建居然只要一分钟!
  15. protobuf 3.5 java使用介绍(二)
  16. 前端页面复制粘贴插件Clipboard的使用
  17. JS18-解决案例中this、for、for...in的问题
  18. Ruby On Rails-2.0.2源代码分析(1)-Rails的启动
  19. java综合技术分享
  20. php对接短信宝,短信宝接入代码

热门文章

  1. 黄聪:使用Wordpress中的wpdb类操作数据库
  2. 医学院计算机社发展,医学院计算机教学创新思路.docx
  3. 【ABAP】供应商进项税额查询报表开发
  4. 【PM模块】维护处理的控制和报告
  5. 【MM配置】评估和账户确定(Valuation Account Determination) - 1
  6. 增强 用文本增强修改SAP标准屏幕中的字段名称 属于元素的文本增强
  7. 7、Power Query-合并查询
  8. ABAP-获取用户的组织结构权限
  9. SAP在物流工作中的应用之学习笔记
  10. 完全删除垃圾Q+!!!