【C++】目標檔案和可執行檔案裡面都有什麼
阿新 • • 發佈:2019-01-26
編譯器編譯原始碼後生成的檔案叫做目標檔案。
從檔案結構上來講,目標檔案已經是二進位制檔案。
編譯是針對單個原始檔的,有幾個原始檔就會生成幾個目標檔案,並且在生成過程中不受其他原始檔的影響。也就是說,不管當前工程中有多少個原始檔,編譯器每次只編譯一個原始檔、生成一個目標檔案。
動態連結庫(DLL,Dynamic Linking Library)(Windows 下的.dll
和 Linux 下的.so
)和靜態連結庫(Static Linking Library)(Windows 下的.lib
和 Linux 下的.a
)也是按照可執行檔案的格式儲存的。
靜態連結庫稍有不同,它是把多個目標檔案捆綁在一起形成一個檔案,再加上一些索引,你可以簡單地把它理解為一個包含了很多目標檔案的包。
在 Linux 下,相信很多讀者都遇到過一種叫做Segment fault(段錯誤)
的錯誤,這種錯誤發生在程式執行期間,在編譯和連結時無法檢測,一般都是程式碼的許可權不足導致的。
可執行檔案不再關注具體的檔案結構,而是關注程式的載入和執行過程。
由於可執行檔案在載入時實際上是被對映的虛擬地址空間,所以可執行檔案很多時候又被叫做映像檔案(Image)。
在連結過程中,連結器會將多個目標檔案中的程式碼段、資料段、除錯資訊等合併成可執行檔案中的一個段。段的合併僅僅是一個簡單的疊加過程。