初识ELF格式 ABI,EABI,OABI
盡管每天都在調用linux的elf文件做各種事,但卻很少去了解他,最近嘗試在orangepi上編譯個elf到android手機上運行,因為兩個CPU都是ARMv8的.結果運行失敗了.遂查找原因.結果挖出這玩意...
以下內容大部分為摘抄整理:
關于ABI,EABI,OABI:
ABI(application binary interface)
應用程序二進制接口
一般應用程序是要分各種CPU架構的,ABI用于對接.
而ABI的不同則是linux內核和glibc的升級導致的規范變化導致的。不同的ABI程序和庫在不同的環境下很高概率是不能運行的,除非是低版本最原始的ABI在現代系統上跑一般都可以向下兼容。而這種不兼容主要發生在C++身上,因為C++近幾年的特性改變速度相對較快,管理困難。X86上常見的elf ABI有:
OS/ABI: UNIX - Linux
OS/ABI: UNIX - System V
OS/ABI: UNIX - GNU
其中GNU和Linux兩種是相同的,只是使用不同版本的readelf會現實不同的結果。而system v則是最古老的,也是兼容性最好的。有的老一些的系統上只識別system v的ABI。但是system v ABI for x86_64卻是比linux還要先進的ABI。因為這個ABI把大部分的參數轉由寄存器傳遞,而不是由棧傳遞,對棧的使用減少就增加了以往的緩存溢出的難度。還有x32上的return to libc等攻擊的手法也得變通,難度提高。
OABI 的O表示Old,舊的ABI
EABI的E表示Embedded 嵌入式,是描述可連接目標代碼,庫目標代碼,可執行文件映像,如何連接,執行和調試,以及目標代碼生成過程,和c,c++語言接口的規范,是編譯連接工具的基礎規范,也是研究它們工作原理的基礎,可惜arm的EABI迄今為止沒有完全訂好。
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
關于編譯器:
Gcc在編譯的時候可以使用--enable-kernel指定最低支持的內核版本,這個選項會在elf頭部添加.note.ABI-tag,如果編譯的時候加入了-g參數,然后用gdb調試就可以顯示。最大程度上查看一個elf文件信息。
Gcc的5.1版本的編譯器會在編譯時做大量激進的優化,但是有的優化是只對于最新的CPU特性有效,老一些的CPU在硬件層面就不支持這些優化,所以如此編譯的程序就有兼容性問題。方法是用更老的編譯器或者是用5.2之后解決了這個問題的更新的編譯器。
附上elf格式解析:
http://i.woblog.cn/2016/08/14/elf-format/
關于調試與分析的一些指令:
(這里只轉介紹,詳情請到http://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/crontab.html查看)
----------------------
file elf文件
可查看一些elf的架構信息
----------------------
readelf -a elf文件
信息更全面
----------------------
ldd elf文件
查看一個程序依賴的庫
----------------------
objdump 二進制文件分析
objdump工具用來顯示二進制文件的信息,就是以一種可閱讀的格式讓你更多地了解二進制文件可能帶有的附加信息。
----------------------
nm 目標文件格式分析
nm 命令顯示關于指定 File 中符號的信息,文件可以是對象文件、可執行文件或對象文件庫。如果文件沒有包含符號信息,nm 命令報告該情況,但不把它解釋為出錯條件。 nm 命令缺省情況下報告十進制符號表示法下的數字值。
----------------------
size 查看文件映射到內存大小
作用:查看程序被映射到內存中的映像所占用的大小信息
----------------------
lsof -c 進程名
查看一個進程打開的文件
其它參數:
-a 列出打開文件存在的進程
-c<進程名> 列出指定進程所打開的文件
-g 列出GID號進程詳情
-d<文件號> 列出占用該文件號的進程
+d<目錄> 列出目錄下被打開的文件
+D<目錄> 遞歸列出目錄下被打開的文件
-n<目錄> 列出使用NFS的文件
-i<條件> 列出符合條件的進程。(4、6、協議、:端口、 @ip )
-p<進程號> 列出指定進程號所打開的文件
-u 列出UID號進程詳情
-h 顯示幫助信息
-v 顯示版本信息
----------------------
pstack
此命令可顯示每個進程的棧跟蹤。pstack 命令必須由相應進程的屬主或 root 運行。可以使用 pstack 來確定進程掛起的位置。此命令允許使用的唯一選項是要檢查的進程的 PID。請參見 proc(1) 手冊頁。
這個命令在排查進程問題時非常有用,比如我們發現一個服務一直處于work狀態(如假死狀態,好似死循環),使用這個命令就能輕松定位問題所在;可以在一段時間內,多執行幾次pstack,若發現代碼棧總是停在同一個位置,那個位置就需要重點關注,很可能就是出問題的地方;
----------------------
strace
strace常用來跟蹤進程執行時的系統調用和所接收的信號。 在Linux世界,進程不能直接訪問硬件設備,當進程需要訪問硬件設備(比如讀取磁盤文件,接收網絡數據等等)時,必須由用戶態模式切換至內核態模式,通過系統調用訪問硬件設備。strace可以跟蹤到一個進程產生的系統調用,包括參數,返回值,執行消耗的時間。
----------------------
ipcs
ipcs是Linux下顯示進程間通信設施狀態的工具,可以顯示消息隊列、共享內存和信號量的信息。對于程序員非常有用,普通的系統管理員一般用不到此指令。
----------------------
iostat
iostat是I/O statistics(輸入/輸出統計)的縮寫,用來動態監視系統的磁盤操作活動。
----------------------
sar
sar是System Activity Reporter(系統活動情況報告)的縮寫。sar工具將對系統當前的狀態進行取樣,然后通過計算數據和比例來表達系統的當前運行狀態。它的特點是可以連續對系統取樣,獲得大量的取樣數據;取樣數據和分析的結果都可以存入文件,所需的負載很小。sar是目前Linux上最為全面的系統性能分析工具之一,可以從14個大方面對系統的活動進行報告,包括文件的讀寫情況、系統調用的使用情況、串口、CPU效率、內存使用狀況、進程活動及IPC有關的活動等,使用也是較為復雜。
----------------------
參考資料:
http://www.shennongmin.org/?p=181
http://www.shennongmin.org/?p=176
http://www.cnblogs.com/mylinux/p/5836795.html
https://www.crifan.com/order_eabi_and_oabi/
http://www.bijishequ.com/detail/124277?p=
總結
以上是生活随笔為你收集整理的初识ELF格式 ABI,EABI,OABI的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Systemd-CentOS7系统服务介
- 下一篇: 指数基金定投怎么买 指数基金定投该怎么买