1. 程式人生 > >《程式設計師的自我修養》第三章 目標檔案裡有什麼

《程式設計師的自我修養》第三章 目標檔案裡有什麼

在PC端的可執行檔案,主要是linux下的ELF(Executable Linkable Format)檔案和windows下的PE檔案。

一般c語言執行程式碼都儲存在.text段上,已經初始化的全域性變數或者區域性靜態變數儲存在.data段上。未初始化的全域性變數和區域性靜態變數儲存在.bss段上。.rodata程式碼段存放的是隻讀資料。

ELF結構:標頭檔案(ELF檔案的描述資訊),段表(描述了每個段的基本資訊),重定位表,字串表。

連結的本質是把不同的目標檔案之間相互粘合在一起。目標檔案的相互拼合實際上是對地址的引用。

強符號和弱符號:對於c/c++來說,編譯器預設的函式和初始化的全域性變數為強符號,未初始化的全域性變數為弱符號。連結器會按照下面的方式選擇強符號和弱符號:如果一個符號在其他檔案中是弱符號,在某個檔案中時強符號,則是強符號;強符號不能夠被多次定義;如果一個符號在所有檔案中都是弱符號,則選擇佔空間最大的一個。

強引用和弱引用:未被定義的弱引用,連結器不認為它是一個錯誤,而是會將其值設定為0或者某個特殊值。在gcc中,我們在函式前面新增 __attribute__ ((weakref))  關鍵字,將改函式宣告為弱引用。如果該函式只有函式簽名沒有函式體,並且前面被聲明瞭該關鍵字__attribute__((weakref)),改函式在編譯和連結的時候編譯器不會報錯,但是在呼叫時會報地址訪問錯誤的錯。

弱引用和弱符號對使用者來說十分有用。比如庫中的弱引用或者弱符號能夠被使用者定義的強引用或者強符號覆蓋。這樣方便程式的裁剪和組合。