1. 程式人生 > >【C++】目標檔案和可執行檔案裡面都有什麼

【C++】目標檔案和可執行檔案裡面都有什麼

編譯器編譯原始碼後生成的檔案叫做目標檔案。

從檔案結構上來講,目標檔案已經是二進位制檔案。

編譯是針對單個原始檔的,有幾個原始檔就會生成幾個目標檔案,並且在生成過程中不受其他原始檔的影響。也就是說,不管當前工程中有多少個原始檔,編譯器每次只編譯一個原始檔、生成一個目標檔案。

動態連結庫(DLL,Dynamic Linking Library)(Windows 下的.dll和 Linux 下的.so)和靜態連結庫(Static Linking Library)(Windows 下的.lib和 Linux 下的.a)也是按照可執行檔案的格式儲存的。

靜態連結庫稍有不同,它是把多個目標檔案捆綁在一起形成一個檔案,再加上一些索引,你可以簡單地把它理解為一個包含了很多目標檔案的包。

在 Linux 下,相信很多讀者都遇到過一種叫做Segment fault(段錯誤)的錯誤,這種錯誤發生在程式執行期間,在編譯和連結時無法檢測,一般都是程式碼的許可權不足導致的。

可執行檔案不再關注具體的檔案結構,而是關注程式的載入和執行過程。

由於可執行檔案在載入時實際上是被對映的虛擬地址空間,所以可執行檔案很多時候又被叫做映像檔案(Image)。

在連結過程中,連結器會將多個目標檔案中的程式碼段、資料段、除錯資訊等合併成可執行檔案中的一個段。段的合併僅僅是一個簡單的疊加過程。