天天看點

可執行檔案(ELF)格式ELF對象檔案(Object files)有三個種類

ELF

ELF(Executable and Linking Format)是一種對象檔案的格式,用于定義不同類型的對象檔案(Object files)中都放了什麼東西、以及都以什麼樣的格式去放這些東西。它自最早在 System V 系統上出現後,被 UNIX 世界所廣泛接受,作為預設的二進制檔案格式來使用。

對象檔案(Object files)有三個種類

可重定位的對象檔案(Relocatable file)

這是由彙編器彙編生成的 .o 檔案。後面的連結器(link editor)拿一個或一些 Relocatable object files 作為輸入,經連結處理後,生成一個可執行的對象檔案 (Executable file) 或者一個可被共享的對象檔案(Shared object file)。我們可以使用 ar 工具将衆多的 .o Relocatable object files 歸檔(archive)成 .a 靜态庫檔案。

可執行的對象檔案(Executable file)

文本編輯器vi、調式用的工具gdb、播放mp3歌曲的軟體等等都是Executable object file。你應該已經知道,在我們的 Linux 系統裡面,存在兩種可執行的東西。除了這裡說的 Executable object file,另外一種就是可執行的腳本(如shell腳本)。注意這些腳本不是 Executable object file,它們隻是文本檔案,但是執行這些腳本所用的解釋器就是 Executable object file,比如 bash shell 程式。

可被共享的對象檔案(Shared object file)

這些就是所謂的動态庫檔案,也即 .so 檔案。如果拿前面的靜态庫來生成可執行程式,那每個生成的可執行程式中都會有一份庫代碼的拷貝。如果在磁盤中存儲這些可執行程式,那就會占用額外的磁盤空間;另外如果拿它們放到Linux系統上一起運作,也會浪費掉寶貴的實體記憶體。如果将靜态庫換成動态庫,那麼這些問題都不會出現。動态庫在發揮作用的過程中,必須經過兩個步驟:

a) 連結編輯器(link editor)拿它和其他Relocatable object file以及其他shared object file作為輸入,經連結處理後,生存另外的 shared object file 或者 executable file。

b) 在運作時,動态連結器(dynamic linker)拿它和一個Executable file以及另外一些 Shared object file 來一起處理,在Linux系統裡面建立一個程序映像。

繼續閱讀