elf檔案格式,全稱為excutable and linking format,是乙個開放的可執行檔案和鏈結檔案格式,在linux上很流行,跨平台軟體的設計也多以elf格式作為標準,其結構擴充套件性相容性都很強.
elf結構分析起來主要有兩種模式,一是編譯時模式,另乙個是執行時模式,同乙個檔案在不同的時期用不同的眼光看,資料雖然沒變化,但是著重點是不同的,在編譯器,檔案以資料節的形式分割槽,在執行時期,檔案以程式段的形式分割槽
基本結構如下
首先是elf頭,elf頭是elf檔案的標識,讀取乙個elf檔案總是從elf頭開始的,他總是在檔案的開頭,結構如下
elf頭開頭的結構體叫做魔數頭,是乙個16位的陣列,(從第九位開始,就是填充位元組,沒有意義的資料)關於它的定義如下
elf頭結構體雖然每乙個資料的長度都不同,但是在檔案的儲存上,它是以每個資料四位的情況來儲存的,只是說四位資料裡面有效資料是那麼長,這樣可以避免檔案讀取的時候的結構體對齊的問題
通過elf頭我們可以看到,elf頭指定了檔案節區頭表的檔案偏移位址,以及節區頭表的數目和大小,通過這個,我們可以讀到節區頭表,也就是說,節區頭表不一定是緊挨在elf頭的後面,他們的關係如下
節區表類似於乙個陣列,防止了e_shnum個節區頭資訊,每個節區頭資訊的長度是e_shensize,這e_shnum個節區在檔案中的存放時連續的,節區頭資訊如下
通過節區頭資料的sh_offset,我們可以找到這個節區頭對應的節區資料,節區資料也不是連續存放在檔案中的
節區資料根據節區頭資訊的sh_type資訊有幾種分類
當sh_type為1,這是乙個程式資料表,裡面存放的是**二進位制資料,長度為節頭指定長度
當sh_type為2,這是乙個符號表,相當於乙個陣列,裡面存放的結構體,陣列長度為sh_size/sh_entsize,每個結構體的定義如下
當sh_type為3,這是乙個字串表,裡面存放著一些字元,相當於乙個字元陣列,乙個elf檔案裡面有兩個字串表,乙個叫做節區頭符串表,乙個叫做通用字串表.我們在節區頭裡面可以看到有乙個sh_name,這是乙個數字,我們需要去節區字串表中尋找對應的字串,尋找方式是,從sh_name中獲得的字串開始索引,直到遇到』\0』字元停止,得到的資料就是該節區字串表的名稱,節區字串表存放在sh_strndx指向的節區裡面,其他的所有名稱都存放在另乙個字串表中,
當sh_type為9,這是乙個重定位表,依然相當於乙個陣列,裡面存放了重定位結構體陣列,陣列長度為sh_size/sh_entsize,每個結構體的定義如下
重要的資料基本就是這些
ELF檔案格式分析 結構篇
elf檔案格式,全稱為excutable and linking format,是乙個開放的可執行檔案和鏈結檔案格式,在linux上很流行,跨平台軟體的設計也多以elf格式作為標準,其結構擴充套件性相容性都很強.elf結構分析起來主要有兩種模式,一是編譯時模式,另乙個是執行時模式,同乙個檔案在不同的...
ELF檔案格式分析
elf檔案 目標檔案 格式主要三種 1 可重定向檔案 檔案儲存著 和適當的資料,用來和其他的目標檔案一起來建立乙個可執行檔案或者是乙個共享目標檔案。目標檔案或者靜態庫檔案,即linux通常字尾為.a和.o的檔案 2 可執行檔案 檔案儲存著乙個用來執行的程式。例如bash,gcc等 3 共享目標檔案 ...
ELF檔案格式
在介紹elf格式之前,先簡單說明一下可執行檔案的生成流程 1 編寫c原始檔,或彙編原始檔 2 準備共享庫格式的目標檔案 shared object file 如數學庫 標準庫 2 用編譯器 compiler 將c編譯成可重定位格式的目標檔案 relocatable object file 用彙編器 ...