前言
目前正在從頭開發一個MIPS的嵌入式項目,有機會從零開始寫ld腳本,於是趁機把GNU LD的官方文檔讀了一遍。
鏈接如下:http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_mono/ld.html
該文檔分為幾個章節,為了便於介紹,我在這里也按照文章的閱讀順序,分別把讀后感記錄在這里。
ld俗稱鏈接器,就是吃進去object files,輸出可執行文件。而可執行文件是可以下載到存儲器讓CPU取指令運行的文件格式。
ld吃下各個object files,並將其消化,最后轉換為生命所需的營養(可執行文件),或者shit(錯誤)。
消化的過程,主要是分析object files里面的符號,例如全局變量,靜態變量,函數名等,根據符號的調用關系,以及ld腳本的安排,將符號安排在內存合適的位置。
關於全局變量,靜態變量,局部變量,函數,這些分別放在text段,data段,還是堆棧的知識,我就不講了,有C語言編程經驗的人應該都知道,不清楚的可以翻K&R的書。
目標文件在其存儲器映像文件中的布局
首先我們來看一本書,《MIPS體系結構透視》,在其9.5小節“目標文件在其存儲器映像文件中的布局”中,描述了可執行文件中的各個段是如何在存儲器映像中布局的。在這一節中有一張圖如下所示,可以顯示出各個段在內存的存儲器中的布局。所以我們在ld腳本中也要按照這個順序來定義各個段。
至於其中每個段的含義,可以參考這本書的這一節啰。這里挑出一點,就是.sbss,還有.bss這兩個的區別,以及.sdata,待續。。。