1. 程式人生 > >linux,windows 可執行檔案(ELF、PE)

linux,windows 可執行檔案(ELF、PE)

很早記接觸這個縮寫英文了。它是什麼意思呢?要理解這個elf檔案是還是比較容易的,如果要掌握它就花點功夫。ELF (Executable And Linkable)UNIX類作業系統中普遍採用的目標檔案格式 。

首先要知道它有什麼作用:
工具介面標準委員會TIS已經將ELF作為執行在Intel32位架構之上的各型別作業系統的可匯出物件檔案格式標準。ELF標準為開發者提供了一組橫跨多執行環境的二進位制介面定義來組織軟體開發 ;
ELF 標準的目的是為軟體開發人員提供一組二進位制介面定義,這些介面可以延伸到多種操作環境,從而減少重新編碼、重新編譯程式的需要。介面的內容包括目標模組格式、可執行檔案格式以及除錯記錄資訊與格式等(以上的一段話引用網上的解釋,比較抽象,好像說什麼跨作業系統的二進位制標準???呵呵 早不到北)


在看一下這段引用:

現在PC平臺流行的可執行檔案格式(Executable)主要是Windows下的PE(Portable Executable)和Linux的ELF(Executable Linkable Format),它們都是COFF(Common file format)格式的變種。
不光是可執行檔案(Windows的.exe和Linux下的ELF可執行檔案)按照可執行檔案格式儲存。動態連結庫(DLL,Dynamic Linking Library)(Windows的.dll和Linux的.so)及靜態連結庫(Static Linking Library)(Windows的.lib和Linux的.a)檔案都按照可執行檔案格式儲存。它們在Windows下都按照PE-
COFF格式儲存,Linux下按照ELF格式儲存。
什麼又是COFF格式呢?
COFF是由Unix System V Release 3首先提出並且使用的格式規範,後來微軟公司基於COFF格式,制定了PE格式標準,並將其用於當時的Windows NT系統。System V Release 4在COFF的基礎上引入了ELF格式,目前流行的Linux系統也以ELF作為基本可執行檔案格式。這也就是為什麼目前PE和ELF如此相似的主要原因,因為它們都是源於同一種可執行檔案格式COFF。

Unix最早的可執行檔案格式為a.out格式,它的設計非常地簡單,以至於後來共享庫這個概念出現的時候,a.out格式就變得捉襟見肘了。於是人們設計了COFF格式來解決這些問題,這個設計非常通用,以至於COFF的繼承者到目前還在被廣泛地使用。

COFF的主要貢獻是在目標檔案裡面引入了“段”的機制,不同的目標檔案可以擁有不同數量及不同型別的“段”。另外,它還定義了除錯資料格式。

總結:看完上面的資料你是已經知道ELF是什麼作用了吧?其實就是Unix下的執行檔案和動態庫(*.so)和目標檔案(*.o)檔案格式。看前面的跨各型別作業系統。。。。呵呵有點誇張,頂多也就是Unix型別的作業系統,比如 fedora redhat unix 等等 利用wine工具不算。

好了知道他有作用了。現在就介紹一下他的具體結構把。都是基於COFF格式發出來的。

目標檔案有三種類型:
1. 可重定位檔案(Relocatable File) 包含適合於與其他目標檔案連結來建立可執行檔案或者共享目標檔案的程式碼和資料。 (Linux的*.o 檔案 Windows的 *.obj檔案)
2. 可執行檔案(Executable File) 包含適合於執行的一個程式,此檔案規定了 exec() 如何建立一個程式的程序映像。(比如/bin/bash檔案;Windows的*.exe)
3. 共享目標檔案(Shared Object File) 包含可在兩種上下文中連結的程式碼和資料。首先連結編輯器可以將它和其它可重定位檔案和共享目標檔案一起處理,生成另外一個目標檔案。其次,動態連結器(Dynamic Linker)可能將它與某個可執行檔案以及其它共享目標一起組合,建立程序映像。
目標檔案全部是程式的二進位制表示,目的是直接在某種處理器上直接執行(Linux的.so,如/lib/ glibc-2.5.so;Windows的DLL)


跟Windows的PE檔案結構類似Linux的目標檔案也是由一組結構體構成的。
下面利用Windows的PE檔案結構來跟Linux的執行檔案來進行一些比較。對比起來容易理解。順便“複習”一下Win PE格式。