早上排队做核酸的路上 打开手机看了点新闻 今天上海破九千了 希望疫情早日结束
另外就是看到了有人讨论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,汇编后的函数名不同。