ELF(Executable and
Linking Format)是一種對象檔案(.o or .obj,目标檔案)的格式,用于定義不同類型的對象檔案(Object
files)中都放了什麼東西、以及都以什麼樣的格式去放這些東西。它自最早在 System V 系統上出現後,被 xNIX
世界所廣泛接受,作為預設的二進制檔案格式來使用。
有四種ELF目标檔案類型:
(1)可重定位的對象檔案(Relocatable file)
這是由彙編器彙編生成的 .o
檔案。
後面的連結器(linker)拿一些
Relocatable object files 作為輸入,經連結處理後,生成一個可執行的對象檔案 (Executable file)
或者一個可被共享的對象檔案(Shared object file)。我們可以使用 ar 工具将衆多的 .o Relocatable
object files 歸檔(archive)成 .a 靜态庫檔案。
(3)可執行的對象檔案(Executable file)
這我們見的多了,就是編譯器生産的可執行程式。
文本編輯器vi、調式用的工具gdb、播放mp3歌曲的軟體mplayer等等都是Executable object file。
主要要跟shell腳本,或者python腳本區分,這些腳本也是可執行的,但是它們的結構不是Executable
file,它們隻是文本,由檔案的第一行#!(shebang)定義系統應該調用那個程式來執行這個文本。
(3)可被共享的對象檔案(Shared object file)
這些就是所謂的動态庫檔案,也即 .so
檔案。如果拿前面的靜态庫來生成可執行程式,那每個生成的可執行程式中都會有一份庫代碼的拷貝。如果在磁盤中存儲這些可執行程式,那就會占用額外的磁盤空間;另外如果拿它們放到Linux系統上一起運作,也會浪費掉寶貴的實體記憶體。如果将靜态庫換成動态庫,那麼這些問題都不會出現。
(4) Linux下的核心轉存檔案(Core Dump File)
當程序意外終止時,系統可以将該程序的位址空間的内容及終止時的一些其它資訊轉存到此Dump File。
可以使用file工具來檢視ELF檔案的類型:
[[email protected]
test]$ which file
/usr/bin/file
[[email protected] test]$ file
a.out
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV),
dynamically linked (uses shared libs), for GNU/Linux 2.6.32,
BuildID[sha1]=7c65ebc8c17e26b13a0355435175680a9e354b2a, not
stripped
[[email protected]
test]$ file
sum.o sub.o test.o libsub.so test
sum.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not
stripped
sub.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not
stripped
test.o: ELF
32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not
stripped
libsub.so: ELF 32-bit LSB shared object, Intel 80386, version 1
(SYSV), not stripped
test: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for
GNU/Linux 2.2.5, dynamically linked (uses shared libs), not
stripped
本文連結:https://www.maixj.net/ict/elf-o-20705