abi_a标签 - CSDN
精华内容
参与话题
  • API、ABI究竟有什么区别?

    千次阅读 2018-11-03 16:07:59
    转载自:... API(application programming interface):应用程序接口 ABI(application binary interface):应用程序二进制接口 应用程序二进制接口(ABI-Application Binary Interface)定义了一...

    转载自:https://blog.csdn.net/xinghun_4/article/details/7905298

    API(application programming interface):应用程序接口

    ABI(application binary interface):应用程序二进制接口

    应用程序二进制接口(ABI-Application Binary Interface)定义了一组在PowerPC系统软件上编译应用程序所需要遵循的一套规则。主要包括基本数据类型,通用寄存器的使用,参数的传递规则,以及堆栈的使用等等。

    ABI涵盖了各种细节:如数据类型、大小和对齐;调用约定(控制着函数的参数如何传送以及如何接受返回值);系统调用的编码和一个应用如何向操作系统进行系统调用;以及在一个完整的操作系统ABI中,目标文件的二进制格式、程序库等等。一个完整的ABI,像Intel二进制兼容标准 (iBCS)[1] ,允许支持它的操作系统上的程序不经修改在其他支持此ABI的操作体统上运行。

    其他的 ABI 标准化细节包括 C++ 名称修饰[2] ,和同一个平台上的编译器之间的调用约定[3],但是不包括跨平台的兼容性。

    ABI不同于应用程序接口(API),API定义了源代码和库之间的接口,因此同样的代码可以在支持这个API的任何系统中编译,然而ABI允许编译好的目标代码在使用兼容ABI的系统中无需改动就能运行。 在Unix风格的操作系统中,存在很多运行在同一硬件平台上互相相关但是不兼容的操作系统(尤其是Intel 80386兼容系统)。有一些努力尝试标准化ABI,以减少销售商将程序移植到其他系统时所需的工作。然而,直到现在还没有很成功的例子,虽然Linux标准化工作组正在为Linux做这方面的努力。

    API,顾名思义,是编程的接口,换句话说也就是你编写“应用程序”时候调用的函数之类的东西。对于内核来说,它的“应用程序”有两种:一种是在它之上的,用户空间的真正的应用程序,内核给它们提供的是系统调用这种接口,比如 read(2),write(2);另一种就是内核模块了,它们和内核处于同一层,内核给它们提供的是导出的内核函数,比如 kmalloc(),printk()。这些接口都是你可以在编写程序的时候直接看到的,可以直接拿来用的。

    而 ABI 是另一种形式的接口,二进制接口。除非你直接使用汇编语言,这种接口一般是不能直接拿来用的。比如,内核系统调用用哪些寄存器或者干脆用堆栈来传递参数,返回值又是通过哪个寄存器传递回去,内核里面定义的某个结构体的某个字段偏移是多少等等,这些都是二进制层面上的接口。这些接口是直接给编译好的二进制用的。换句话说,如果 ABI 保持稳定的话,你在之前版本上编译好的二进制应用程序、内核模块,完全可以无须重新编译直接在新版本上运行。另一种比较特殊的 ABI 是像 /proc,/sys 目录下面导出的文件,它们虽然不是直接的二进制形式,但也会影响编译出来的二进制,如果它里面使用到它们的话,因此这些“接口”也是一种 ABI。

    你平时看到的什么 POSIX 标准啊,C99 标准啊,都是对 API 的规定。而规定 ABI 的标准就不多,而且也没那么强势,Linux 上面的 ABI 标准似乎只有 Linux Foundation 提供的一些标准

    好了,从上面我们可以看出,其实保持一个稳定的 ABI 要比保持稳定的 API 要难得多。比如,在内核中 int register_netdevice(struct net_device *dev) 这个内核函数原型基本上是不会变的,所以保持这个 API 稳定是很简单的,但它的 ABI 就未必了,就算是这个函数定义本身没变,即 API 没变,而 struct net_device 的定义变了,里面多了或者少了某一个字段,它的 ABI 就变了,你之前编译好的二进制模块就很可能会出错了,必须重新编译才行。

    你可能会感到意外,上游的 Linux 内核其实不光不保持稳定的 ABI,它就连稳定的 API 都不会保持!而且还牛逼哄哄地写了一个文档,叫 stable_api_nonsense.txt。这么做的道理是,内核一直在向前推进,而且速度很快,内核开发者们并不想因为 API 的限制而阻碍前进的脚步!毕竟我们不想成为下一个 Windows!:-)

    所以,你的驱动在不同版本的内核上不经修改直接运行那几乎是不太可能的,就算是你允许重新编译也未必就能不经修改编译成功。即使在同一个大版本的不同发行版上也可能不行。

    那你应该怎么办?最好的办法莫过于把你的驱动贡献到社区,汇入内核源代码树中,这样一旦内核的 API 有改动,改动这个 API 的人就有义务替你修改你的驱动的代码,你只需要 review 一下(或者这个也会有人帮你),也省去你不少时间,何乐而不为呢?另一种办法就是基于某个提供稳定 ABI 的内核,比如红帽的 RHEL (认为这是广告的人请使用 CentOS,谢谢!),红帽的企业版内核保证有稳定的 ABI,只要你没有跨大的版本,因为我们的源代码里会检测 ABI 的变化,为此我们实在付出了不少努力。

    展开全文
  • LINUX中EABI和ABI的理解

    千次阅读 2013-01-25 09:46:41
    我在编译linux2.6.30的时候,关于是否在内核特性主页中选择ABI或EABI出现了疑问,现在网上引用了下面的内容,在此向作者表示感谢: 1。什么是ABI ABI,application binary interface (ABI),应用程序二进制...

    我在编译linux2.6.30的时候,关于是否在内核特性主页中选择ABI或EABI出现了疑问,现在网上引用了下面的内容,在此向作者表示感谢:


    1。什么是ABI

    ABI,application binary interface (ABI),应用程序二进制接口。
    既然是 接口,那就是某两种东西之间的沟通桥梁,此处有这些种情况:
    A。应用程序 <-> 操作系统;
    B。应用程序 <-> (应用程序所用到的)库
    C 。应用程序各个组件之间

    类似于API的作用是使得程序的代码间的兼容,ABI目的是使得程序的二进制(级别)的兼容。

    2。什么是OABI 和 EABI
    OABI中的O,表示“Old”,“Lagacy”,旧的,过时的,OABI就是旧的/老的ABI。
    EABI中的E,表示“Embedded”,是一种新的ABI。
    EABI有时候也叫做GNU EABI。
    OABI和EABI都是专门针对ARM的CPU来说的。

    3。EABI的好处 / 为何要用EABI
    A。支持软件浮点和硬件实现浮点功能混用
    B。系统调用的效率更高
    C。后今后的工具更兼容
    D。软件浮点的情况下,EABI的软件浮点的效率要比OABI高很多。

    4。OABI和EABI的区别
    两种ABI在如下方面有区别:
    A。调用规则(包括参数如何传递及如何获得返回值)
    B。系统调用的数目以及应用程序应该如何去做系统调用
    C。目标文件的二进制格式,程序库等

    D。结构体中的 填充(padding/packing)和对齐。


    Embedded application binary interface, 即嵌入式应用二进制接口,是描述可连接目标代码,库目标代码,可执行文件影像,如何连接,执行和调试,以及目标代码生成过程,和c, c++语言接口的规范,是编译连接工具的基础规范,也是研究它们工作原理的基础.




    展开全文
  • ABI 的意义

    2012-10-18 10:05:23
    ABI是系统与应用之间的协议. 一个BINARY(EXEC, LIB)必需符合ABI才能在相应的系统上运行. 比如我在PC上用不管什么样的COMPILER, 只要产生符合LINUX的ELF文件, 用相应的INSTRUCTION SET(比如INTEL, PPC, SPARC). 就...

    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和EABI

    2019-07-01 11:29:50
    1.ABI application binary interface (ABI),应用程序二进制接口。 2.什么是OABI 和 EABI OABI中的O,表示“Old”,“Lagacy”,旧的,过时的,OABI就是旧的/老的ABI。 EABI中的E,表示“Embedded”,是一种新的...

    1.ABI

    application binary interface (ABI),应用程序二进制接口。

    2.什么是OABI 和 EABI
    OABI中的O,表示“Old”,“Lagacy”,旧的,过时的,OABI就是旧的/老的ABI。
    EABI中的E,表示“Embedded”,是一种新的ABI。
    EABI有时候也叫做GNU EABI。
    OABI和EABI都是专门针对ARM的CPU来说的。

    3.EABI的好处 / 为何要用EABI
    A。支持软件浮点和硬件实现浮点功能混用
    B。系统调用的效率更高
    C。后今后的工具更兼容
    D。软件浮点的情况下,EABI的软件浮点的效率要比OABI高很多。

     

    gnueabi和gnueabihf

    适用于armel和armhf这两种架构,两种架构在对待浮点运算采取了不同的策略。不同的CPU要选择合适的编译器。

    更详细内容可参考https://blog.csdn.net/soaringlee_fighting/article/details/70214785

    展开全文
  • Android的.so文件、ABI和CPU的关系

    万次阅读 2018-09-05 21:51:10
    你也可以查看我的其他同类文章,也会让你有一定的收货关于ABI的知识,我整理这两篇博客,相信会对你有帮助ABI和CPU关系的疑难杂症 Android的.so文件、ABI和CPU的关系早期的Android系统几乎只支持ARMv5的CPU架构,你
  • API、ABI区别

    万次阅读 2012-08-24 19:24:57
    应用程序二进制接口(ABI-Application Binary Interface)定义了一组在PowerPC系统软件上编译应用程序所需要遵循的一套规则。主要包括基本数据类型,通用寄存器的使用,参数的传递规则,以及堆栈的使用等等。 ABI...
  • 一、ABI 是什么 ABI 是 Application Binary Interface 的缩写。 不同 Android 手机使用不同的 CPU,因此支持不同的指令集。CPU 与指令集的每种组合都有其自己的应用二进制界面(或 ABI)。 ABI 可以非常精确地定义...
  • 获取Android手机CPU/ABI型号

    万次阅读 2016-06-16 08:06:05
    获取Android手机CPU/ABI
  • 如何查看Android设备的ABI

    千次阅读 2017-11-21 14:44:49
    通过命令查看1、adb shell 2、cat /proc/cpuinfo可以从输出看到ARMv7 Processor : ARMv7 Processor rev 0 (v7l) processor : 0 BogoMIPS : 38.40 processor : 1 BogoMIPS : 38.40 processor : 2
  • ELF file OS ABI invalid

    万次阅读 2012-05-13 15:09:08
    今天在弄mjpeg-streamer的时候,由于没有安装jpeg库,就倒腾了一下。相到上次移植板子的时候,做过类似的工作,就...“/usr/lib/libjpeg.so.62: ELF file OS ABI invalid” ELF file OS ABI invalid 二进制级
  • 关于abiFilters的使用

    万次阅读 多人点赞 2016-08-25 13:41:57
    关于abi兼容的选择。abiFilters在app的使用
  • arm芯片中的浮点运算(二)

    千次阅读 2012-07-14 11:10:35
    ABI即“application binary interface”,即编译器将c代码编译成汇编代码时使用的一种规则 使用规范如下: 在编译带有浮点参数的函数时,有三种可能的编译选项:  -mfloat-abi=soft  -mfloat-abi=softfp  -...
  • elf file OS ABI invalid

    万次阅读 2013-08-28 08:20:24
    昨天调用第三方库的JNI时发现如下问题:elf file OS ABI invalid问题出自ldd,先看一下ldd的版本号。使用: ldd --version这个问题是因为在ldd 为2.12的机器上编译。拿到ldd 为2.5的机器上去运行加载,然后就挂掉了...
  • 让APK只包含指定的ABI

    万次阅读 2016-07-21 19:59:35
    现在很多android第三方 sdk是以aar形式提供的,如果这个sdk对abi的支持比较全,可能会包含armeabi, armeabi-v7a,x86, arm64-v8a,x86_64五种abi,而你应用的其它so只支持armeabi,armeabi-v7a,x86三种,直接引用sdk的...
  • 你必须知道的ABI和CPU关系

    万次阅读 2019-02-27 22:14:07
    在这里非常感激腾讯bugly的“Bugly-Android_符号表-Jalen”,对我有很多启发和帮助ABI和CPU的重要知识1、 很多设备都支持多于一种的ABI。 2、 当一个应用安装在设备上,只有该设备支持的CPU架构对应的.so文件会被...
  • TARGET_ARCH_ABI

    千次阅读 2014-03-27 13:26:46
    $(NDK)/build/core/setup-abi.mk ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) RS_TRIPLE := armv7-none-linux-gnueabi endif ifeq ($(TARGET_ARCH_ABI),armeabi) RS_TRIPLE := arm-none-linux-gnueabi endif ifeq
  • No CPU/ABI system image available for this target Create new Android Virtual Device(AVD) 创建新的手机模拟器时,不能点OK完成, 提示如图中错误。是缺少相应的映象文件造成。 请在Android SDK Manager 里...
  • Application.mk中APP_ABI

    万次阅读 2016-03-15 20:21:28
    在Application.mk文件中有个预定义命令参数APP_ABI,是指明编译与调试的CPU架构。 目前Android系统支持以下七种不同的CPU架构:ARMv5,ARMv7(从2010年起),x86(从2011年),MIPS(从2012年),ARMv8,MIPS64和...
  • undefined reference std::__cxx11::basic_string ...cmake cxxflags -D_GLIBCXX_USE_CXX11_ABI in cmake clion  add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0) In the case of cmake, it is trans
  • 模拟器创建提示如下图 看到这些,我们就得更新一下sdk , 但更新sdk时,我们会遇到访问失败 , 我们就得做一个代理,如下图  按此图设置好以后,就能更新我们的Sdk 了 感谢此人的详细说明 ...
1 2 3 4 5 ... 20
收藏数 46,789
精华内容 18,715
关键字:

abi