初次理解ABI

早上排队做核酸的路上 打开手机看了点新闻 今天上海破九千了 希望疫情早日结束

另外就是看到了有人讨论C已经不是一种编程语言了 其中大量谈及ABI 那么ABI是什么呢?我之前的学习中也遇到过几次ABI 但是认真说起来 记忆有点模糊

第一次听到ABI时 觉得是别人说错了 应该是API吧 那么API又是什么呢?

API:一些结构体或者函数提供给第三方使用。在C语言中大概就是头文件的意思。一般C语言会以函数的形式调用API,每个API调用都定义了对内核的操作以及操作的参数,API没有具体内容,但是库中有具体的函数内容。操作系统相关的就是提供给内核用的,如open( );相当于一种接口

ABI:更贴近硬件的接口,它规定了二进制代码之间的调用规则,不同的语言系统会有自己的定义,比如函数名字的变化 以及函数的返回值放在栈?寄存器?还是先分配内存就放在那个位置?另外就是参数的位置。具体来说,汇编和C语言的函数名是不一样的,一般为了更好的兼容 库都提供C语言的ABI,如果是C++,加上extern “C” 则是说明使用C语言的ABI。

例:

一个程序调用了一个函数,如果编译器可以找到这个函数,则编译通过,即API调用成功

但是!这并不代表整个调用成功

首先,硬件平台是否一致?如果编译出的代码和运行函数的代码不是一个硬件平台的,则调用不成功;

其次,硬件平台一致,在函数调用时,要以函数指定的方式和位置(内存或者寄存器)设置参数,然后通过中断或者其他方式跳转到被调用代码的起始位置执行。被调用代码从指定位置取到参数,处理完毕后将结果放在指定位置,最后程序到指定位置取回结果,调用结束。

在这个过程中,存放参数和结果的位置,被调用函数的跳转地址或者中断代码都是ABI的范畴,如果存取参数,结果的位置没有明确规范,或者调用和被调用双方没有遵照一个统一规范,或者系统系统的库函数路径不正确,或者中断代码错误,则调用不会成功。

具体来说ABI是系统和CPU架构定义的

C++: int add_two(int a, int b) —> __Z7add_twoii:

C: int add_two(int a, int b) —> _add_two:

C和C++有不同的ABI,汇编后的函数名不同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值