初識ELF格式 ABI,EABI,OABI

2021-09-25 18:26:35 字數 2552 閱讀 9997

儘管每天都在呼叫linux的elf檔案做各種事,但卻很少去了解他,最近嘗試在orangepi上編譯個elf到android手機上執行,因為兩個cpu都是armv8的.結果執行失敗了.遂查詢原因.結果挖出這玩意...

以下內容大部分為摘抄整理:

關於abi,eabi,oabi:

應用程式二進位制介面

一般應用程式是要分各種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迄今為止沒有完全訂好。

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

關於編譯器:

gcc在編譯的時候可以使用--enable-kernel指定最低支援的核心版本,這個選項會在elf頭部新增.note.abi-tag,如果編譯的時候加入了-g引數,然後用gdb除錯就可以顯示。最大程度上檢視乙個elf檔案資訊。

gcc的5.1版本的編譯器會在編譯時做大量激進的優化,但是有的優化是只對於最新的cpu特性有效,老一些的cpu在硬體層面就不支援這些優化,所以如此編譯的程式就有相容性問題。方法是用更老的編譯器或者是用5.2之後解決了這個問題的更新的編譯器。

附上elf格式解析:

關於除錯與分析的一些指令:

(這裡只轉介紹,詳情請到檢視)

file elf檔案

可檢視一些elf的架構資訊

readelf -a elf檔案

資訊更全面

ldd elf檔案

檢視乙個程式依賴的庫

objdump 二進位制檔案分析

nm 目標檔案格式分析

nm 命令顯示關於指定 file 中符號的資訊,檔案可以是物件檔案、可執行檔案或物件檔案庫。如果檔案沒有包含符號資訊,nm 命令報告該情況,但不把它解釋為出錯條件。 nm 命令預設情況下報告十進位制符號表示法下的數字值。

size 檢視檔案對映到記憶體大小

作用:檢視程式被對映到記憶體中的映像所占用的大小資訊

lsof -c 程序名

檢視乙個程序開啟的檔案

其它引數:

pstack

此命令可顯示每個程序的棧跟蹤。pstack 命令必須由相應程序的屬主或 root 執行。可以使用 pstack 來確定程序掛起的位置。此命令允許使用的唯一選項是要檢查的程序的 pid。請參見 proc(1) 手冊頁。

這個命令在排查程序問題時非常有用,比如我們發現乙個服務一直處於work狀態(如假死狀態,好似死迴圈),使用這個命令就能輕鬆定位問題所在;可以在一段時間內,多執行幾次pstack,若發現**棧總是停在同乙個位置,那個位置就需要重點關注,很可能就是出問題的地方;

strace

strace常用來跟蹤程序執行時的系統呼叫和所接收的訊號。 在linux世界,程序不能直接訪問硬體裝置,當程序需要訪問硬體裝置(比如讀取磁碟檔案,接收網路資料等等)時,必須由使用者態模式切換至核心態模式,通過系統呼叫訪問硬體裝置。strace可以跟蹤到乙個程序產生的系統呼叫,包括引數,返回值,執行消耗的時間。

ipcs

ipcs是linux下顯示程序間通訊設施狀態的工具,可以顯示訊息佇列、共享記憶體和訊號量的資訊。對於程式設計師非常有用,普通的系統管理員一般用不到此指令。

----------------------

iostat

iostat是i/o statistics(輸入/輸出統計)的縮寫,用來動態監視系統的磁碟操作活動。

sarsar是system activity reporter(系統活動情況報告)的縮寫。sar工具將對系統當前的狀態進行取樣,然後通過計算資料和比例來表達系統的當前執行狀態。它的特點是可以連續對系統取樣,獲得大量的取樣資料;取樣資料和分析的結果都可以存入檔案,所需的負載很小。sar是目前linux上最為全面的系統效能分析工具之一,可以從14個大方面對系統的活動進行報告,包括檔案的讀寫情況、系統呼叫的使用情況、串列埠、cpu效率、記憶體使用狀況、程序活動及ipc有關的活動等,使用也是較為複雜。

elf檔案格式 ELF 格式詳解(一)

elf 全稱 executable and linkable format 即可執行可鏈結檔案格式,目前常見的linux android可執行檔案 共享庫 so 目標檔案 o 以及core 檔案 吐核 均為此格式。檔案布局 常見的elf檔案大致結構如下 靜態鏈結器 即編譯後參與生成最終elf過程的鏈...

ELF格式說明

elf file header elf檔案頭 define ei nident 16 typedef struct elf32 ehdr typedef struct elf64 ehdr 程式頭結構 program segment header.typedef struct elf32 phdr ...

ELF檔案格式

在介紹elf格式之前,先簡單說明一下可執行檔案的生成流程 1 編寫c原始檔,或彙編原始檔 2 準備共享庫格式的目標檔案 shared object file 如數學庫 標準庫 2 用編譯器 compiler 將c編譯成可重定位格式的目標檔案 relocatable object file 用彙編器 ...