api 是应用程序和操作系统之间的接口,凡是符合该api标准的应用程序都可以在支持该api的操作系统上编译通过。
abi 是二进制级别的接口,规定了二进制文件的格式、内容、装载/卸载程序的要求、函数调用时的参数传递
规则、寄存器、堆栈的使用。
如果操作系统都支持该api,但是机器的体系结构不同即他们的abi不同,那么在一个机器上生成的二进制代码是不可以在另外一台机器上面运行成功的,可能因为函数调用的参数传递规则不同或者其他由abi定义的行为产生的差异性。
其实关键的是abi定义了运行时的兼容性问题,这个问题是api无法解决的。api所能解决的是静态状态下的兼容性问题。
ABI是系统与应用之间的协议. 一个BINARY(EXEC, LIB)必需符合ABI才能在相应的系统上运行.
比如我在PC上用不管什么样的COMPILER, 只要产生符合LINUX的ELF文件, 用相应的INSTRUCTION SET(比如INTEL, PPC, SPARC). 就可以在一个LINUX机器上运行. 调用系统或别人的LIB.
ABI定义了BINARY的文件格式, 内容, 以及装载/卸载程序的要求, 函数调用的参数传递规则, 寄存器, 堆栈的使用等.
abi(应用二进制接口)我的理解就是机器代码一层的接口。先说一下api(特指系统调用),
api基本上是和机器硬件平台无关但是和操作系统密切相关的接口,一个api调用定义了一个对内核的操作,以及操作的参数。C语言会议函数的形式调用api。
abi,是比api更贴近硬件的一层接口,它规定的是二进制代码之间的调用规则。举个例子来说吧!
一个应用程序,调用了.so库中的函数或者系统调用,如果它的编译器可以找到被调用函数或者系统
调用的话,则编译可以同过,也就是说,它是用的api是正确的。但是,这个调用离成功还很远。。。。。
首先,如果编译出来的代码和运行库函数和系统调用的代码不是一个硬件平台的,则这个应用根本就不能和被调用代码运行在一起,则调用不会成功。
即使库函数、系统调用和是运行在同一硬件平台上的调用也不一定会趁成功。因为程序最终是被编译成二进制代码的,并且是要加载到内存中运行的。那么,在调用库函数或者系统调用的时候,应用要先要以库函数或者系统调用指定的方式和位置(内存或者寄存器)设置参数,然后通过中断或者其他方式跳转到被调用代码的起始处进行执行,被调用代码从指定位置去到参数,处理完毕之后再将结果放到指定的位置,最后应用再到指定的地方取回结果,调用完毕!
我认为这个过程中,存放参数和结果的位置属于abi规定的范围,被调用程序的跳转地址或者中断号码也是abi规定的范围。如果存取参数、结果的位置没有明确的规范,或者调用、被调用双方没有遵照统一个规范,那么这个调用根本就不可能成功;如果系统提供的库函数路径不正确,调用也不会成功;如果中断代码使用错误,调用也不会正确。abi 就是在这个层次上对应用程序的一个规范。
在计算机中,应用二进制接口描述了应用程序(或者其他类型)和操作系统之间或其他应用程序的低级接口。
ABI涵盖了各种细节:如数据类型、大小和对齐;调用约定(控制着函数的参数如何传送以及如何接受返回值);系统调用的编码和一个应用如何向操作系统进行系统调用;以及在一个完整的操作系统ABI中,目标文件的二进制格式、程序库等等。一个完整的ABI,像Intel二进制兼容标准 (iBCS),允许支持它的操作系统上的程序不经修改在其他支持此ABI的操作体统上运行。
其他的 ABI 标准化细节包括 C++ 名称修饰,和同一个平台上的编译器之间的调用约定,但是不包括跨平台的兼容性。
ABI不同于应用程序接口(API),API定义了源代码和库之间的接口,因此同样的代码可以在支持这个API的任何系统中编译,然而ABI允许编译好的目标代码在使用兼容ABI的系统中无需改动就能运行。 在Unix风格的操作系统中,存在很多运行在同一硬件平台上互相相关但是不兼容的操作系统(尤其是Intel 80386兼容系统)。有一些努力尝试标准化ABI,以减少销售商将程序移植到其他系统时所需的工作。然而,直到现在还没有很成功的例子,虽然Linux标准化工作组正在为Linux做这方面的努力。
嵌入式应用二进制接口指定了文件格式、数据类型、寄存器使用、堆积组织优化和在一个嵌入式软件中的参数的标准约定。开发者使用自己的汇编语言也可以使用EABI作为与兼容的编译器生成的汇编语言的接口。 支持EABI的编译器创建的目标文件可以和使用类似编译器产生的代码兼容,这样允许开发者链接一个由不同编译器产生的库。EABI与关于通用计算机的ABI的主要区别是应用程序代码中允许使用特权指令,不需要动态链接(有时是禁止的),和更紧凑的堆栈帧组织用来节省内存。广泛使用EABI的有Power PC和ARM.
分享到:
相关推荐
Application Binary Interface (应用程序二进制接口),编译器和我们编写汇编代码是需要遵循的规范。
这里面有个主要的问题是EABI,我开始的时候并不知道怎么指定gcc的EABI,还以为4.1以上的gcc自动都是EABI,结果就是生成的内核能跑,而init进程(根文件系统的第一个进程)却运行不了。而最让我啼笑皆非的是 readelf,...
解决Android studio报:No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android的问题
解决Android studio 编译错误问题:No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android。 下载后解压,放到android-sdk-windows\ndk-bundle\toolchains目录下,然后...
1、CPU/ABI找不到 当选择Target Android4.2.2-API Level 117时, CPU/ABI 一直显示灰色,无法选择 确定是缺少:ARM EABI v7a System Image 网上找到,ARM EABI v7a System Image,下载后, 放在SDK/Platform/Android...
PowerPC处理器的嵌入式ABI,用于嵌入式系统在线调试
RISC-V 架构以其卓越的指令集架构以及...4.risc-v eabi 定义了 risc-v 架构的嵌入式 abi 规则,即汇编语言到机器二进制码的规则定义。 以上技术规范是打算深入了解 risc-v 架构软件开发需要了解的,尤其是指令集规范~
IAR Systems即将发布支持ARM EABI开放标准的IAR Embedded Workbench Version 5 for ARM,这是对公司的旗舰产品—编译器和调试器的重大升级,使之成为第一个独立支持最新的ARM Cortex-M1处理器的开发工具。...
问题描述: 最近公司准备搞短视频项目需要使用ffmpeg。这里面需要NDK技术。下载好NDK,发现以前项目打不开。这项目是3年前开发的。导致NDK版本过低缺少mipsel文件,去官网下载下载NDK压缩包把里面缺少的文件黏贴进去...
这是在创建模拟器时需要的system image,也就是在创建模拟器时 CPU/ABI项需要选择的,下载并解压后,将解压出的整个文件夹复制或者移动到 your sdk 路径/system-images文件夹下即可, 如果没有 system-images目录就...
这是在创建模拟器时需要的system image,也就是在创建模拟器时 CPU/ABI项需要选择的,下载并解压后,将解压出的整个文件夹复制或者移动到 your sdk 路径/system-images文件夹下即可, 如果没有 system-images目录就...
这是在创建模拟器时需要的system image,也就是在创建模拟器时 CPU/ABI项需要选择的,下载并解压后,将解压出的整个文件夹复制或者移动到 your sdk 路径/system-images文件夹下即可, 如果没有 system-images目录就...
clang -c -target arm-none-eabi -mcpu = cortex-m4 -O0 -mfloat-abi = hard -g main.c -o main.o arm-none-eabi-gcc -c -g -mcpu = cortex-m4 -mthumb -mlittle-endian -mfpu = fpv4-sp-d16 -mfloat-abi = hard -...
以下是示例编译和链接行供参考: arm-none-eabi-g++ -mcpu=cortex-m4 -mthumb -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -O2 -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -fno-inline-...
支持的架构libseccomp库当前支持以下列出的体系结构: 32位x86(x86) 64位x86(x86_64) 64位x86 x32 ABI(x32) 32位ARM EABI(ARM) 64位ARM(aarch64) 32位MIPS(mips) 32位MIPS小尾数(mipsel) 64位MI