什麼是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