1. 程式人生 > >連結、裝載和庫—目標檔案裡有什麼

連結、裝載和庫—目標檔案裡有什麼

編譯器編譯原始碼後生成的檔案叫做目標檔案。
目標檔案從結構上將,它是已經編譯後的可執行檔案格式,只是還沒有經過連結的過程,其中可能有些符號或地址還沒有被調整。其實它本身就是按照可執行檔案格式儲存的,只是跟真正的可執行檔案在結構上稍有不同。

3.1 目標檔案的格式
目標檔案就是原始碼編譯後但未進行連結的那些中間檔案(Windows的.obj和Linux下的.o),它跟可執行檔案的內容與結構很相似,所以一般跟可執行檔案格式一起採用一種格式儲存。
此外,動態連結庫(DLL,Dynamic Linking Library)(Windows的.dll和Linuxde 。so)及靜態連結庫(Static Linking Library)(Windows的.lib和Linux的.a)檔案都可按照可執行檔案格式儲存。靜態連結庫稍有不同,它是把很多目標檔案捆綁在一起形成一個檔案,再加上一些索引,可以簡單地把它理解為一個包含有很多目標檔案的檔案包。

3.2 目標檔案是什麼樣的
目標檔案中的內容有編譯後的機器指令程式碼、資料,以及連結時所需要的一些資訊,如符號表、除錯資訊、字串等。一般目標檔案將這些資訊按照不同的屬性,以“節”(Section)恩恩形式儲存,有時候也叫“段”(Segment),在一般情況下,他們都表示一個一定長度的區域,基本上不加以區別。
總體來說,程式原始碼被編譯以後主要分成兩種段:程式指令和程式資料。程式碼段屬於程式指令,而資料段和.bss段屬於程式資料。

3.3 挖掘.o檔案