• [整理]EABI和OABI【转】


    本文转载自:https://www.crifan.com/order_eabi_and_oabi/

    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)和对齐。
    E。
    OABI:
    * ABI flags passed to binutils: -mabi=apcs-gnu -mfpu=fpa
    * gcc -dumpmachine: arm-unknown-linux
    * objdump -x for compiled binary:

    private flags = 2: [APCS-32] [FPA float format] [has entry point]

    * "file" on compiled Debian binary:

    ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.2.0, dynamically linked (uses shared libs), for GNU/Linux 2.2.0, stripped

    * "readelf -h | grep Flags""

    Flags: 0x0

    EABI:
    * ABI flags passed by gcc to binutils: -mabi=aapcs-linux -mfloat-abi=soft -meabi=4
    * gcc -dumpmachine: arm-unknown-linux-gnueabi
    * objdump -x for compiled binary:

    private flags = 4000002: [Version4 EABI] [has entry point]

    * "file" on compiled binary (under Debian):

    ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.4.17, dynamically linked (uses shared libs), for GNU/Linux 2.4.17, stripped

    * "readelf -h | grep Flags""

    Flags: 0x4000002, has entry point, Version4 EABI

    【如何查看当前的库文件或者目标文件是EABI还是OABI】

    可以通过readelf -h查看:

    [crifan@linux-41lh bch]$readelf -h a_eabi_object.obj
    ELF Header:
    Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
    Class:                             ELF32
    Data:                              2's complement, little endian
    Version:                           1 (current)
    OS/ABI:                            UNIX – System V
    ABI Version:                       0
    Type:                              REL (Relocatable file)
    Machine:                           ARM
    Version:                           0x1
    Entry point address:               0x0
    Start of program headers:          0 (bytes into file)
    Start of section headers:          42880 (bytes into file)
    Flags:                             0x4000000, Version4 EABI
    Size of this header:               52 (bytes)
    Size of program headers:           0 (bytes)
    Number of program headers:         0
    Size of section headers:           40 (bytes)
    Number of section headers:         12
    Section header string table index: 9

    [crifan@linux-41lh bch]$readelf -h a_oabi_object.obj 
    ELF Header:
    Magic:   7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 00 00 
    Class:                             ELF32
    Data:                              2's complement, little endian
    Version:                           1 (current)
    OS/ABI:                            ARM
    ABI Version:                       0
    Type:                              REL (Relocatable file)
    Machine:                           ARM
    Version:                           0x1
    Entry point address:               0x0
    Start of program headers:          0 (bytes into file)
    Start of section headers:          46400 (bytes into file)
    Flags:                             0x200, GNU EABI, software FP
    Size of this header:               52 (bytes)
    Size of program headers:           0 (bytes)
    Number of program headers:         0
    Size of section headers:           40 (bytes)
    Number of section headers:         24
    Section header string table index: 21

    【提示】

    常见遇到的一些问题,我所知道的是,对于OABI的交叉编译器,比如arm-linux-gcc这一套工具,如果你当初是用oabi编译的,那么生成的整套工具链,也是oabi的,用oabi的工具链去编译和链接其他eabi的库,就会出问题,常常是在ld的时候,提示类似如下错误:

    arm-linux-ld: error: Source object drivers/mtd/bch/bch_4_s_noRomtable.obj has EABI version 0, but target drivers/mtd/built-in.o has EABI version 4

    其解决办法就是,用同一套去编译不同的文件和链接不同的库,比如都是用OABI或者都是用EABI,比如重新去编译一个EABI的交叉工具链,然后用这个EABI的工具链去编译你其他的文件。

    【参考】
    1。ABI/EABI/OABI
    http://blog.csdn.net/hongjiujing/archive/2008/07/21/2686556.aspx
    2。Why ARM's EABI Matters
    http://www.chineselinuxuniversity.net/articles/1255.shtml

    3.[PDF]The new arm ABI (EABI) and Debian armel port

    下载此文件 (29 个页面)

    4ArmEabiPort

    http://wiki.debian.org/ArmEabiPort

    转载请注明:在路上 » [整理]EABI和OABI

  • 相关阅读:
    CF1580B Mathematics Curriculum
    [机房测试]变异大老鼠
    http_缓存
    UDP_概述
    记录: webAssembly 延申
    Event
    NetWork_timeLine
    基于Typora的Latex代码书写并移植到word中
    ZooKeeper学习总结
    HBase学习总结
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/7199704.html
Copyright © 2020-2023  润新知