關於ABI OABI EABI

什麼是EABI

Embedded application binary interface, 即嵌入式應用二進制接口,是描述可連接目標代碼,庫目標代碼,可執行文件影像,如何連接,執行和調試,以及目標代碼生成過程,和c, c++語言接口的規範,是編譯連接工具的基礎規範,也是研究它們工作原理的基礎,可惜arm的EABI迄今爲止沒有完全訂好。作爲EABI的組成部分有過程調用規範,可執行文件格式規範,c/c++ ABI規範和調試格式規範。

內核裏面談EABI,OABI,其實相對於系統調用的方式,當然我們所說的系統限於arm系統。

什麼是ABI

ABI,application binary interface (ABI),應用程序二進制接口。既然是 接口,那就是某
兩種東西之間的溝通橋樑,此處有這些種情況:

  • 應用程序 <-> 操作系統;
  • 應用程序 <-> (應用程序所用到的)庫
  • 應用程序各個組件之間

類似於API的作用是使得程序的代碼間的兼容,ABI目的是使得程序的二進制(級別)的兼容。

什麼是OABI 和 EABI

OABI中的O,表示“Old”,“Lagacy”,舊的,過時的,OABI就是舊的/老的ABI。

EABI中的E,表示“Embedded”,是一種新的ABI。

EABI有時候也叫做GNU EABI。

OABI和EABI都是專門針對ARM的CPU來說的。

EABI的好處 / 爲何要用EABI

  • 支持軟件浮點和硬件實現浮點功能混用
  • 系統調用的效率更高
  • 後今後的工具更兼容
  • 軟件浮點的情況下,EABI的軟件浮點的效率要比OABI高很多。

OABI和EABI的區別

兩種ABI在如下方面有區別:

  • 調用規則(包括參數如何傳遞及如何獲得返回值)
  • 系統調用的數目以及應用程序應該如何去做系統調用
  • 目標文件的二進制格式,程序庫等
  • 結構體中的 填充(padding/packing)和對齊。
  • 還有

    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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章