0.前言
在學習嵌入式的過程中發現鏈接文件是一個非常重要的文件,關系到程序的組織以及最終生產的代碼。本文參考一篇英文文檔,原文鏈接為:
http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_mono/ld.html
本文并非逐句翻譯,可能會有刪減。
1.概覽
ld用于鏈接一些目標文件和歸檔文件,重定位他們的數據和綁定符號引用。通常情況下編譯的最后一個步驟就是運行ld。
ld的鏈接命令是以ATT鏈接編輯命令語法的超集,對整個鏈接過程提供顯示的和完整的控制。
這個版本的ld使用通用的BSD庫來運行目標文件。它運行ld去讀取、聯合和寫多種格式的目標文件,比如COFF文件或者a.out文件。不同格式的文件可以鏈接在一起以產生任何可用類型的目標文件。
除了靈活性以外,GNU連接器在提供診斷信息方面比其他連接器更有幫助。許多連接器在遇到錯誤時會立即放棄執行。而ld只要有可能,就會繼續執行,允許你去識別其他錯誤(或者在一些情況下,盡管有錯誤也能輸出目標文件)。
2.調用
GNU鏈接器旨在覆蓋多種情況,并且盡可能的與其他連接器保持兼容,因此,你有多種選擇可以來控制它的行為。
3.命令行選項
鏈接器支持大量的命令行選項,但在實際應用中,有一部分很少在實際應用中使用。例如,一個經常使用ld的情況為在一個標準的,支持unix的系統上連接一個標準的unix目標文件。在這樣的一個系統中,鏈接一個文件hello.o:
ld -o output /lib/crt0.o hello.o -lc
上面的命令告訴連接器生成一個叫output的文件,作為crt0.o和hello.o以及libc.a的連接結果,libc.a為來自于一個標準的搜索目錄。(具體參閱下文的“-l”選項)。
ld的命令行可以以任意的順序指定,并且可以隨意重復。重復使用不同參數的大多數選項將不會產生進一步的影響,或者覆蓋之前該選項出現的位置(在命令行的左側)。
非選項參數是要被連接的目標文件。他們可以跟隨、先于或者混入命令行選項,除了不可以在一個參數選項和它的參數之間放置。
通常連接器要調用至少一個目標文件,你也可以使用-l、-R和腳本命令語言指定其他格式的二進制輸入文件。如果沒有指定二進制輸入文件,那么連接器不會產生任何輸出,并輸出消息“無輸入文件”
如果連接器無法識別目標文件的格式,則會認為它是連接器腳本。以這種方式指定的腳本會增加用于連接的主連接器腳本(要么使用默認的連接器腳本,要么使用“-T”指定的腳本)。此功能運行連接器連接到一個文件,該文件看起來像是一個對象或者歸檔文件,但實際上僅僅是定義了一些符號值,或者使用INPUT或者GROUP去加載其他對象。請注意,以這種方式指定腳本只能用于擴充主連接器腳本;如果你想使用一些邏輯上只能出現一次的命令,如SECTIONS或者MEMORY命令,則必須使用“-T”來替換默認鏈接腳本。具體請參閱命令語言章節。
對于名稱為單個字母的選項,選項參數必須緊跟選項字母,中間不能使用空格,或者作為一個單獨的參數立即提供。
對于名稱為多個字母的選項,可以在選項名稱前加上一個或者兩個“-”,多字母選項的參數必須通過等號與選項名稱分開,或則在需要它們的選項之后立即作為單獨的參數提供。例如“--oformat srec”和“--oformat = srec”是等價的。多字母選項名稱的唯一縮寫是可以接受的。
待續
選項參數較多,另起一篇文章,待續。。。。。。