elf指executable and linking format,不僅包含可執行檔案,也包含庫檔案,包括靜態庫和動態庫。
準備的說,也就是三種(這不廢話嗎):
可執行檔案
靜態鏈結庫
動態鏈結庫
要觀察elf的具體資訊,可以用以下幾個工具
nm: lists symbols from object files.
objdump: displays detailed information from object files.
readelf: displays information about elf object files.
靜態鏈結庫
text:二進位製碼,代表邏輯本身
data:初始化過了的全域性以及靜態的c變數,
bss:未初始化的全域性c變數,這一部分只算是佔位,卻不占用任何空間。目標檔案格式為了節省空間特意把初始化過的變數和未初始化的變數區別對待,這樣做的方式就是:未初始化的變數不佔任何空間。
symtab:符號表。符號表含有本編譯模組定義和引用的函式和全域性變數的符號資訊。
rel data:重定位資訊
bss
在c語言中,沒有顯式初始化的靜態變數會被初始化為0或者null指標。c對於0值得實現通常使用乙個bit模板,因此,bss段包括所有檔案域內未初始化的物件(變數和常量),未初始化的靜態區域性變數(用static修飾符修飾的區域性變數)。而靜態區域性常量必須在宣告的時候被初始化。
符號表符號和符號表
1. 被本模組定義並且能被其他模組引用的全域性符號。全域性符號包含非靜態c函式,非靜態全域性變數;
2. 被其他模組定義但卻被本模組引用的全域性符號。這些符號被稱為externals並且關聯於定義於其他模組的c函式和變數;
3. 本地符號只能被本模組定義和引用。一些本地變數指的是靜態的c函式和靜態的全域性變數,這些變數在本模組是可見的,但對於外部模組不可見。目標檔案中的段和
注意本地符號不同於本地程式變數,symtab中的符號表不包含區域性變數。這些被在執行時放置在棧上並且不為鏈結器所知。
重定位
這一步鏈結器會把同樣型別的區域融合成乙個區域。比如所有input目標檔案的。data部分會融合成輸出的可執行檔案的data部分。鏈結器分配實時記憶體給新的整合區域,給每個輸入模組的這個區域,給每個輸入模組定義的符號。當這一步完成後,程式中每乙個指令和全域性變數都有了唯一乙個執行時記憶體位址。
那麼,什麼事重定位入口呢?當乙個彙編器產生乙個目標模組時,它不知道這些**和資料最終會被存在記憶體的什麼地方。它也不知道這個目標模組所引用的外部符號(包括函式名和全域性變數)的記憶體位置。所以當彙編器不知道乙個符號的確切位址的時候,它會產生乙個重定向入口來告訴鏈結器如何去修改這個入口並融合這個目標檔案到可執行檔案中。**中的重定位入口放在.relo .text,初始化過的重定位入口在relo.data
乙個典型的重定位入口是這樣的:
typedef struct elf32_rel;
動態鏈結庫
動態鏈結庫,也就是乙個so庫,它可能是在程式link的時候使用到,然後在load的時候一起load進來;還有一種可能是程式自己取dlopen乙個庫,再dlclose乙個庫。
動態鏈結庫在程式執行的時候也需要,靜態鏈結庫只在鏈結的時候需要。
靜態鏈結庫只是一堆目標檔案的壓縮集,比如乙個可執行檔案exe鏈結的時候,找到對應的目標檔案,抽取出來打包到exe中去。
而且動態鏈結庫是可以共享的,但是為什麼可以共享呢?
可執行目標檔案
可執行目標檔案擁有了所有資訊,可以load進**來執行了。
elf可執行檔案可以很容易的加載入記憶體,它有持續的可執行的檔案塊,可以對映到連續的記憶體區域。這個對映被描述為segment header table。
乙個可執行程式執行的過程:
unix執行execve程式,execve觸發loader,loader從磁碟上拷貝**和資料到記憶體,然後跳轉到入口點開始執行。這個拷貝程式到記憶體並且執行它的過程叫載入。每個unix程式都有乙個執行記憶體映像,linux下,**段起始於0x08048000,資料段在隨後的以4k為邊界的區域,堆在讀寫區域的下乙個4k邊界區域並且通過呼叫malloc向上生長。0x40000000為共享庫所保留,使用者堆疊起始於0xbfffffff並向下生長。0xc00000000以上的區域屬於核心。但64位機上,不是這樣了,什麼樣有待研究。
乙個可執行檔案執行後的記憶體映像
ELF檔案格式
在介紹elf格式之前,先簡單說明一下可執行檔案的生成流程 1 編寫c原始檔,或彙編原始檔 2 準備共享庫格式的目標檔案 shared object file 如數學庫 標準庫 2 用編譯器 compiler 將c編譯成可重定位格式的目標檔案 relocatable object file 用彙編器 ...
ELF檔案格式
1.目標檔案 編譯器和彙編器生成可重定位目標檔案 包括共享目標檔案 鏈結器生成可執行目標檔案。2.可重定位目標檔案和可執行目標檔案的格式 可重定位目標檔案格式 可執行目標檔案格式 3.下面我們開始分析上面 而對於未被初始化的全域性變數和靜態區域性變數,編譯的時候並未被分配空間,而是僅僅在.bss段中...
elf檔案格式
1.elf檔案頭 elf header 標識該檔案為elf檔案 有關檔案型別和大小的資訊 檔案載入進入記憶體後的入口點資訊。2.程式頭表 program header table 向系統提供了可執行檔案的資料在程序虛擬位址空間中組織方式 檔案包含的段的數目 位置和用途。3.節 section 和 段...