- ABI (Application Binary interface): 二进制接口
- API(Application programming interface):应用程序接口
ABI
目标文件格式(Linux: ELF, windows: PE)、符号修饰标准、变量内存分布/对齐方式、函数调用方式等这些跟二进制可执行代码兼容性相关的内容称为ABI。
ABI(Application Binary Interface)为应用程序二进制接口,描述了应用程序和操作系统之间,一个应用和它的库之间,或者应用的组成部分之间的二进制层面的底层接口。影响ABI的因素非常多,硬件、编程语言、编译器、链接器、操作系统等都会影响ABI。
- name mangling(名字重整): 也称为 名字修饰(name decoration),当你通过API调用库里的一个函数,此时会去查找函数符号表,函数符号表会对函数名进行名字修饰,如C++允许重载,即两个函数可以同名但不同参数,所以要把参数信息一起编码进去才能进行查找,这个就是name mangling。该修饰规则由编译器实现,如果规则不一致,认为ABI不兼容,从而导致查找失败。
- calling convention(调用约定): 是指当一个函数被调用时,函数的参数会被传递给被调用的函数和返回值会被返回给调用函数。函数的调用约定就是描述参数返回值是怎么传递和由谁平衡堆栈的。
简单理解函数的调用
查看动态库.so的编译器信息:
$ strings libc10.so | grep GCC
GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
_Unwind_Resume@@GCC_3.0
GCC_3.0