elf
檔案格式學習
文章出處:
結合例項解讀
elf檔案
-閱讀筆記
bkbll([email protected], [email protected])
自unix
系統實驗室
(usl)
開發和發布了
executable and linking format(elf)
這樣的二進位制格式以後,在
*nix
系統上elf
就取代了
out可執行檔案格式,成為了主要的目標檔案格式。
注:這裡的目標檔案是指(可暫時理解為)gcc用–c,-o,-shared所產生的.o,可執行(預設是a.out),.so檔案。
elf檔案)格式主要三種:
relocatable file
):檔案儲存著**和適當的資料,用來和其他的目標檔案一起來建立乙個可執行檔案或者是乙個共享目標檔案。由編譯器和彙編器生成,將由鏈結器處理。
executable file
):檔案儲存著乙個用來執行的程式;該檔案指出了
exec(ba_os)
如何來建立程式程序映象。所有重定向和符號都解析完成了,如果存在共享庫的鏈結,那麼將在執行時解析。
shared object file
[請參看
ld(sd_cmd)]
,可以和其他的可重定向和共享目標檔案來建立其他的目標檔案。第二個是動態鏈結器,聯合乙個可執行檔案和其他的共享目標檔案來建立乙個程序映象。包含鏈結時所需的符號資訊和執行時所需的**。
elf檔案。
hello.c
#
include
int main(
)
gcc編譯
hello.c
檔案$ uname -a
linux ubuntu804 2.6.24-26-generic #1 smp tue dec 1 18:37:31 utc 2009 i686 gnu/linux
$ gcc -
-version
gcc (gcc) 4.2.4 (ubuntu 4.2.4-1ubuntu4)
inc.
this is free software; see the source for copying conditions. there is no
warranty;
not even for merchantability or fitness for a particular purpose.
)編譯重定向檔案:
$ gcc -c hello.c
$file hello.o
hello.o: elf 32-bit lsb relocatable, intel 80386, version 1 (sysv)
,not stripped
)編譯可執行檔案:
$ gcc -o hello hello.o
$ file hello
hello: elf 32-bit lsb executable, intel 80386, version 1 (sysv)
,for gnu/linux 2.6.8, dynamically linked (
uses shared libs)
,not stripped
ldd命令檢視
hello
這個可執行檔案動態鏈結的共享庫。
$ ldd hello
libc.so.6 =
> /lib/tls/i686/cmov/libc.so.6 (0xb7d99000)
/lib/ld-linux.so.2 (0xb7ef8000)
)編譯共享目標檔案:
$ gcc -shared hello.c -o hello.so
$ file hello.so
hello.so: elf 32-bit lsb shared object, intel 80386, version 1 (sysv)
,not stripped
後續部分:
ELF檔案格式
在介紹elf格式之前,先簡單說明一下可執行檔案的生成流程 1 編寫c原始檔,或彙編原始檔 2 準備共享庫格式的目標檔案 shared object file 如數學庫 標準庫 2 用編譯器 compiler 將c編譯成可重定位格式的目標檔案 relocatable object file 用彙編器 ...
ELF檔案格式
1.目標檔案 編譯器和彙編器生成可重定位目標檔案 包括共享目標檔案 鏈結器生成可執行目標檔案。2.可重定位目標檔案和可執行目標檔案的格式 可重定位目標檔案格式 可執行目標檔案格式 3.下面我們開始分析上面 而對於未被初始化的全域性變數和靜態區域性變數,編譯的時候並未被分配空間,而是僅僅在.bss段中...
ELF檔案格式
elf指executable and linking format,不僅包含可執行檔案,也包含庫檔案,包括靜態庫和動態庫。準備的說,也就是三種 這不廢話嗎 可執行檔案 靜態鏈結庫 動態鏈結庫 要觀察elf的具體資訊,可以用以下幾個工具 nm lists symbols from object fil...