`
kongweile
  • 浏览: 517420 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

ABI和EABI是什么

 
阅读更多

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 PCARM.

分享到:
评论

相关推荐

    powerpc_eabi_app.rar_PowerPC EABI_PowerPC_EABI_Tools_powerpc_pow

    标签"powerpc_eabi"、"powerpc_eabi_tools"和"powerpc"、"powerpc_abi"再次强调了PowerPC EABI和相关的开发工具,以及与PowerPC架构的整体关联。 压缩包内的"eabi_app.pdf"很可能是关于PowerPC EABI的详细技术文档...

    arm eabi 讲解

    - **新的ARM ABI (EABI)**:引入了许多重要的变更,包括但不限于对浮点运算的支持、内存访问模型、异常处理机制等方面的改进。 - **Debian armel端口**:为了适应新版本的ARM EABI,Debian项目对其ARM端口进行了相应...

    CCS C2000系列生成bin文件报错解决

    CCS C2000系列生成bin文件报错解决

    arm-linux-androideabi-4.9.7z

    arm-linux-androideabi-4.9工具链包含了用于这个过程的编译器、链接器和其他必要工具。 二、工具链组成 arm-linux-androideabi-4.9工具链主要包括以下组件: 1. **GCC(GNU Compiler Collection)**:这是一个...

    gcc-arm-none-eabi-6-2017-q2-update-win32.exe

    这里的“ABI”代表Application Binary Interface,它定义了二进制代码如何与操作系统和其他软件交互。"none-eabi"表明这个工具链是为没有操作系统或微内核的裸机环境设计的,比如在嵌入式设备上,这些设备可能不运行...

    arm-linux-androideabi

    解决Android studio 编译错误问题:No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android。 下载后解压,放到android-sdk-windows\ndk-bundle\toolchains目录下,然后...

    arm-linux-androideabi-4.6.zip_androideabi

    “androideabi”标签表示该工具链遵循Android ABI规范,确保编译出的程序能与Android系统的其他组件正确交互。Android支持多种ABI,包括armeabi、armeabi-v7a、arm64-v8a等。armeabi-v7a是arm-linux-androideabi-4.6...

    gcc-arm-none-eabi-5_4-2016q3-20160926-win32

    标题中的“gcc-arm-none-eabi-5_4-2016q3-20160926-win32”是指一个针对ARM架构、非嵌入式ABI(Application Binary Interface)的GCC(GNU Compiler Collection)编译器工具链。这个版本是2016年第三季度发布,具体...

    gcc-arm-none-eabi-10-2020-q4-major-win32.zip

    ARM-NONE-EABI是GCC的一个特定配置,意为“ARM架构,非嵌入式ABI(Application Binary Interface)”,这里的“非嵌入式”指的是不依赖于任何特定的操作系统,适用于裸机或轻量级RTOS环境。 二、工具链组成 GCC-...

    gcc-arm-none-eabi-10.3-2021.07-win32.zip

    以上就是关于`gcc-arm-none-eabi-10.3-2021.07-win32.zip`的详细解析,它为ARM Cortex-M处理器的开发提供了强大的工具链支持,使得开发者能够高效地编写、编译和调试嵌入式应用程序。通过熟练掌握这些工具,开发者...

    arm-gnu-abi接口手册

    通过深入研究《ARM-GNU-Linux ABI接口手册》,开发者可以更好地理解在ARM架构上开发GNU/Linux应用时,如何有效地管理和利用资源,确保代码的兼容性和效率。手册不仅提供了技术细节,还展示了在不同操作系统环境下...

    gcc-arm-none-eabi-8-2018-q4-major-win32

    `arm-none-eabi`部分表示这个工具链是为“没有嵌入式ABI(Application Binary Interface)”的ARM处理器设计的,这意味着它不包含任何特定的操作系统支持,适合于裸机编程或运行轻量级RTOS。 "bin"目录通常包含可...

    PowerPC ABI Compliant Programs

    它为软件开发者提供了选择不同供应商提供的编译库和软件开发工具的机会,只要这些工具和服务符合EABI标准,它们就能相互协作。 #### EABI与PowerPC ABI的区别 EABI与PowerPC ABI补充版的主要区别在于其目标是为了...

    gcc-arm-none-eabi-6-2017-q2-update-win32.zip

    “arm-none-eabi”则是目标体系架构的标识,意为ARM架构的非嵌入式ABI(Application Binary Interface),这表明该工具链用于编译生成适用于ARM设备的代码,而非标准的Linux或Android环境。 接下来,让我们逐个分析...

    gcc-arm-none-eabi-5_4-2016q3-20160926-win32.exe

    "arm-none-eabi"部分代表了目标架构是ARM的"没有嵌入式ABI(Application Binary Interface)",这意味着它适用于不包含标准C库或其他操作系统服务的裸机系统。 描述中给出的信息重复了标题,表明这个文件是一个.exe...

    arm-none-eabi-i686-linux-gnu.tar.zip_android_arm eabi_arm-none-e

    同时,为了确保编译出的库与Android系统兼容,需要遵循Android NDK的规则,例如指定正确的ABI、库版本和系统头文件路径。 总之,“arm-none-eabi-i686-linux-gnu.tar.zip”是一个强大的工具,使得开发者能够在Linux...

    自己实验建立交叉编译工具链(ARM EABI based.docx

    EABI(Embedded Application Binary Interface)是嵌入式系统中的一个标准,它定义了应用程序如何与操作系统和底层硬件交互。EABI的正确指定对于确保编译出的代码能在目标平台上正确执行至关重要。 在创建一个基于...

    mips64el-linux-android和arm-linux-androideabi-4.9

    解决Android studio报:No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android的问题

Global site tag (gtag.js) - Google Analytics