GNU LD之二LD script


前言

目前正在從頭開發一個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,待續。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM