




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、使用ld* 本文檔介紹GNU連接器ld的2.14版本.本文檔在GNU自由文檔許可證下發行.在"GNU自由文檔許可證"一章中有關于本許可證的一份拷貝.概述*'ld'把一定量的目標文件跟檔案文件連接起來,并重定位它們的數據,連接符號引用.一般,在編譯一個程序時,最后一步就是運行'ld'.'ld'能接受連接命令語言文件,這是一種用AT&T的連接編輯命令語言的超集寫成的文件,用來在連接的整個過程中提供顯式的,全局的控制.本版本的'ld'使用通用BFD庫來操作目標文件.這就允許'ld'讀取,合并,
2、寫入目標文件時,可以使用各種不同的格式,比如,COFF或'a.out'. 不同的格式可以被連接到一起產生一個有效的目標文件.除了它的靈活性,GNU連接器比其它連接器更有用的地方在于它提供了診斷信息. 許多連接器在碰到一個錯誤的時候立即放棄執行;但'ld'卻能夠繼續執行,以讓你發現其他的錯誤(或者,在某些情況下,得到一個帶有錯誤的輸出文件)引用*GNU連接器'ld'能夠處理大量的不同情況,并且跟其他的連接器保持盡可能的兼容.這樣,你就擁有更多的選擇來控制它的行為.命令行選項=連接器提供大量的命令行選項,但是,在實際使用中,只有少數被經常使用.比如,
3、'ld'的一個經常的使用場合是在一個標準的Unix系統上連接標準的Unix目標文件.在這樣的一個系統上,連接文件'hello.o'如下: ld -o OUTPUT /lib/crt0.o hello.o -lc這告訴'ld'產生一個叫OUTPUT的文件,作為連接文件'/lib/crt0.o'和'hello.o'和庫'libc.a'的結果.'libc.a'來自標準的搜索路徑.(參閱下文的關于'-l'選項的討論).有些命令行選項可以在命令行的任何位置出現.但是,那些帶有文
4、件名的選項,比如'-l'或者'-T',會讓文件在選項出現的位置上被讀取. 對于非文件選項,以帶不同的參數重復它,不會有進一步的效果,或者覆蓋掉前面的相同項.那些多次出現時具有特殊含義的選項會在下文的描述中指出.無參數選項是那些被連接的目標文件和檔案文件.它們可能緊隨命令行選項,或在它們前面,或者跟它們夾雜在一起,但是一個目標文件參數是不會出現在一個選項跟它的參數之間的.通常,連接器至少引用一個目標文件,但是你可指定其它形式的二進制輸入文件,這可以通過'-l','-R'或者腳本命令語言來實現.如果沒有任何二進制文件被指定,連接器不會
5、產生任何輸出,并給出信息:"缺少輸入文件."如果連接器不能識別目標文件的格式,它會假設這些只是連接腳本.以這種方式指定的腳本增加了連接用的主連接腳本的內容(主連接腳本即缺省連接腳本或使用'-T'指定的腳本). 這個特性可以允許連接器連接一些文件,它們看上去既像目標文件,又像檔案文件,但實際上只是定義了一些符號值,或者使用'INPUT'或'GROUP'來載入其它的目標文件.需要注意的是,用這種方式指定一個腳本只是增加了主連接腳本的內容;要完全替換掉主連接腳本,需要使用'-T'.對于名稱是單個字符的選項,選項參數必
6、須緊跟在選項字母后面,中間不留空,或者也可留有一個空格.對于名稱是多個字符的選項,選項前可以有一個或兩個破折號;比如,'-trace-symbol'和-trace-symbol'是等價的. 注意,對于這條規則有一個例外.那些以小寫字母'o'開頭的多字符選項前面只能是兩個破折號,這是為了避免跟選項'-o'混淆. 比如'-omagic'把輸出文件的名字定為'magic',而'-omagic'在輸出文件中設置NMAGIC標志.多字符選項的參數必須跟選項名間以一個等于號分開,或者以一個空格分開.比如
7、:-trace-symbol foo'和-trace-symbol=foo'是等價的. 多字符選項的名字唯一縮寫符也是可以被接受的.注意,如果連接器通過被編譯器驅動來間接引用(比如gcc), 那所有的連接器命令行選項前必須加上前綴'-Wl'(或者能被特定編譯器驅動接受的其他前綴),就像下面這樣: gcc -Wl,-startgroup foo.o bar.o -Wl,-endgroup這很重要,因為否則的話,編譯器驅動程序會默認丟掉這些連接選項,產生一個錯誤的連接.下面是關于被GNU連接器接受的常用命令行開關的一個列表:-aKEYWORD'這個選項在HP
8、/UX兼容系統上被支持. 參數KEYWORD必須是下面字符串中的一個:archive', shared', or default'. -aarchive'在功能上跟-Bstatic'相同,而另外兩個關鍵字功能上跟-Bdynamic'相同. 這個選項可被多次使用.-AARCHITECTURE'-architecture=ARCHITECTURE'在最近發行版本的'ld'中,這個選項只在Intel 960系列架構上有用. 在那種'ld'配置中,參數 ARCHITECTURE確定960系列的某一特定架構,
9、啟用某些安全措施,并修改檔案庫的搜索路徑.將來的'ld'發行版可能為其它架構系列支持相似的功能.-b INPUT-formAT'-format=INPUT-formAT''ld'可以被配置為支持多于一種的目標文件.如果你的'ld'以這種方式被配置,你可以使用'-b'選項為輸入目標文件指定二進制格式. 就算'ld'被配置為支持可選目標格式,你不必經常指定這一項,因為'ld'被配置為在每一臺機子上把最常用的格式作為默認輸入格式. INPUT-formAT是一個字符串,你可能在連接一個不常
10、用的二進制格式文件時需要這個參數.你也可使用'-b'來顯式切換格式(在連接不同格式的目標文件時),方法是在每一組特定格式的目標前使用'-b INPUT-formAT'.缺省的格式是從環境變量'GNUTARGET'中得到的.你也可以從一個腳本中定義輸入格式,使用的命令是'TARGET'.-c MRI-COMMANDFILE'-mri-script=MRI-COMMANDFILE'為了跟MRI生產的連接器兼容,'ld'接受另一種用受限命令語言寫成的腳本文件,通過選項'-c'引入MRI腳本
11、文件;使用'-T'選項是運行用普通'ld'腳本語言寫的連接腳本.如果MRI-CMDFILE不存在,'ld'在'-L'指定的目錄中尋找.-d'-dc'-dp'這三個選項是等價的; 多字符形式是為了跟其他連接器兼容才被支持的.它們給普通符號分配空間,即使一個重定位輸出文件已經被指定(通過'-r'). 腳本命令FORCE_COMMON_ALLOCATION'具有同樣的效果.-e ENTRY'-entry=ENTRY'使用符號ENTRY作為你的程序的開始執行點,而不是使用缺省
12、的進入點.如果沒有叫做ENTRY的符號,連接器會企圖把ENTRY作為一個數字進行分析,并使用它作為入口地址(數字會被解釋為10進制的;你可以使用前導的'0x'強制為16進制,或'0'作為8進制.)-E'-export-dynamic'當創建一個動態連接的可執行程序時, 把所有的符號加到動態符號表中.動態符號表是一個符號集,這些符號對于運行時的動態對象是可見的.如果你不使用這個選項,動態符號表中就會只含有那些連接進來的動態對象中用到的符號如果你使用'dlopen'來載入動態對象,它需要引用程序中的符號,那你可能需要在連接程序時用到這
13、個選項.你也可以使用版本腳本來控制哪些符號應當被加到動態符號表中.-EB'連接big-endian對象. 這會影響缺省輸出格式.-EL'連接little-endian對象. 這會影響缺省輸出格式.-g'忽略. 為了跟其它工具兼容而提供.-i'執行一個增量連接(跟'-r'等同)-init NAME'當創建一個ELF可執行文件或共享對象時,當可執行文件或共享對象被加載時,調用NAME, 這是通過把DT_INIT設置成函數的地址實現的. 缺省情況下,連接器使用'_init'作為調用的函數.-lARCHIVE'-libra
14、ry=ARCHIVE'增加一個檔案文件ARCHIVE到連接的文件列表中.這個選項可以被多次使用. 'ld'會為每一個指定的ARCHIVE搜索它的路徑列表,尋找libARCHIVE.a'對于支持共享庫的系統, 'ld'可能還會搜索擴展名不是'.a'庫.特別的,在ELF和SunOS系統上,'ld'會在搜索帶有'.a'擴展名的庫前搜索帶'.so'擴展名的庫.-M'-print-map'打印一個連接位圖到標準輸出.一個連接位圖提供的關于連接的信息有如下一些:* 目標文件和符號
15、被映射到內存的哪些地方.* 普通符號如何被分配空間.* 所有被連接進來的檔案文件,還有導致檔案文件被包含進來的那個符號.-n'-nmagic'關閉所有節的頁對齊,如果可能,把輸出格式標識為'NMAGIC'.-N'-omagic'把text和data節設置為可讀寫.同時,取消數據節的頁對齊,同時,取消對共享庫的連接.如果輸出格式支持Unix風格的magic number, 把輸出標志為'OMAGIC'.-no-omagic'這個選項執行的操作大部分正好跟'-N'相反.它設置text節只讀,強制data節頁對齊
16、. 但是,這個選項并不開啟連接共享庫的功能. 使用'-Bdynamic'開啟這個功能.-o OUTPUT'-output=OUTPUT'使用OUTPUT作為'ld'產生的程序的名字;如果這個選項沒有指定,缺省的輸出文件名是'a.out'.腳本命令'OUTPUT'也可以被用來指定輸出文件的文件名.-O LEVEL'如果LEVEL是一個比0大的數值, 'ld'優化輸出.這可能會明顯多占用時間,所以只有在生成最后的文件時使用.-q'-emit-relocs'把重定位節和內容留在完全
17、連接后的可執行文件中. 連接分析和優化工具可能需要這些信息用來進行正確的修改與執行. 這在大的可執行文件中有用.這個選項目前只支持ELF平臺.-r'-relocateable'產生可重定位的輸出, 比如,產生一個輸出文件它可再次作為'ld'的輸入.這經常被叫做"部分連接".作為一個副作用,在支持標準Unix魔數的環境中,這個選項會把輸出文件的魔數設置為'OMAGIC'. 如果這個選項沒有被指定,一個絕對文件就會被產生.當連接C+程序時,這個選項就不會解析構造函數的引用;要解析,必須使用'-Ur'如果輸入文件跟輸
18、出文件的格式不同,只有在輸入文件不含有重定位信息的時候部分連接才被支持.輸出格式不同的時候會有更多的限制.比如,有些'a.out'的格式在輸入文件是其他格式的時候完全不支持部分連接.這個選項跟'-i'等效.-R FILENAME'-just-symbols=FILENAME'從FILENAME中讀取符號名跟它們的值,但不重位這個文件,或者根本不把它包含在輸出文件中.這就允許你的輸出文件引用其它程序中定義的絕對內存地址.你可以多次使用這個選項.為了跟其他ELF連接器兼容,如果'-R'選項后面跟有一個目錄名,而不是一個文件名,它會被處
19、理成'-rpath'選項.-s'-strip-all'忽略輸出文件中所有的符號信息.-S'-strip-debug'忽略輸出文件中所有的調試符號信息(但不是所有符號).-t'-trace'打印'ld'處理的所有輸入文件的名字.-T SCRIPTFILE'-script=SCRIPTFILE'把SCRIPTFILE作為連接腳本使用. 這個腳本會替代'ld'的缺省連接腳本(而不是增加它的內容),所以命令文件必須指定所有需要的東西以精確描述輸出文件. 如果SCRIPTFILE在當前目錄下不
20、存在,'ld'會在'-L'選項指定的所有目錄下去尋找.多個'-T'選項會使內容累積.-u SYMBOL'-undefined=SYMBOL'強制SYMBOL在輸出文件中作為一個無定義的符號被輸入.這樣做會有一些效果,比如,會引發從標準庫中連接更多的模塊. '-u'可以以不同的參數反復使用,以輸入多個無定義的符號.這個選項跟連接腳本命令中的'EXTERN'是等效的.-Ur'對于不是C+的程序,這個選項跟'-r'是等效的: 它產生可重定位的輸出,比如,一個輸出文件它可以再次作為&
21、#39;ld'的輸入. 當連接C+程序時,'-Ur'解析構造函數的引用,跟'-r'不同. 但如果在一些用'-Ur'連接過的文件上再次使用'-Ur',它不會工作,因為一旦構造函數表被建立,它不能被添加內容.請只在最后一遍連接的時候使用'-Ur', 對其它的,只使用'-r'.-unique=SECTION'對于所有匹配SECTION的輸入節,在輸出文件中都各自創建單獨的節,或者,如果可選的通配符SECTION參數丟失了,為每一個孤兒輸入節創建一個輸出節. 一個孤兒節是一個連接腳本中沒有指
22、定的節.你可以在命令行上多次使用這個選項; 它阻止對同名輸入節的合并,在連接腳本中重載輸出節分配.-v'-version'-V'顯示'ld'的版本. '-V'選項同時會列出支持的模擬器.-x'-discard-all'刪除所有的本地符號.-X'-discard-locals'刪除所有的臨時本地符號.對于大多數目標平臺,就是所有的名字以'L'開頭的本地符號.-y SYMBOL'-trace-symbol=SYMBOL'打印出所有SYMBOL出現的被連接文件的名字. 這個選項可以
23、被多次使用. 在很多系統中,這在預先確定底線時很有必要.當你擁有一個未定義的符號,但不知道這個引用出自哪里的時候,這個選項很有用.-Y PATH'為缺省的庫搜索路徑增加一條路徑.這個選項是為了跟Solaris兼容.-z KEYWORD'能被識別的關鍵字包括'initfirst', 'interpose', 'loadfltr',nodefaultlib', nodelete', nodlopen', nodump', now', origin',combreloc', noc
24、ombreloc' and nocopyreloc'. 為了跟Solaris兼容,所有其它的關鍵字都被忽略. 'initfirst'標志一個對象,使它在運行時,在所有其他對象之前被初始化. 'interpose'標志一個對象,使它的符號表放在所有其他符號之前,作為主要的執行者. 'loadfltr'標志一個對象, 使它的過濾器在運行時立即被處理.'nodefaultlib'標志一個對象,使在搜索本對象所依賴的庫時,忽略所有缺省庫搜索路徑. 'nodelete'標志一個對象,使它在運行時不會被從內存中
25、刪除.'nodlopen'標志一個對象,使這個對象不可以通過'dlopen'載入.'nodump'標志一個對象,使它不能被'dldump'轉儲. 'now'標志一個對象,使它成為非懶惰運行時綁定對象. 'origin'標志一些可能含有$ORIGIN的對象,'defs'不允許無定義符號. 'muldefs'允許重定義. 'comberloc'組合多個重定位節,重新排布它們,讓動態符號可見. 'nocomberloc'使多個重定位節組合無效
26、. 'nocopyreloc'使重定位拷貝后的結果無效.-( ARCHIVES -)'-start-group ARCHIVES -end-group'ARCHIVES應當是一個關于檔案文件的列表. 它們可以是顯式的文件名,或者'-l'選項.這些指定的檔案文件會被多遍搜索,直到沒有新的無定義引用被創建. 通常,一個檔案文件只會被搜索一次. 但如果這個檔案文件中的一個符號需要被用來解析一個檔案中的目標引用到的無定義的符號,而這個符號在命令行上的后面某個檔案文件中出現, 連接器不能解析這個引用. 把這些檔案文件分組后,它們都可被反復搜索直到所有可能的
27、引用都被解析了為止.使用這個選項有一個很大的運行開銷. 只有在無法避免在多個檔案文件中使用循環引用時才用它.-accept-unknown-input-arch'-no-accept-unknown-input-arch'告訴連接器接受那些架構不能被識別的輸入文件. 但前提假設是用戶知道他們在做什么,并且是故意要連接這些未知的輸入文件. 在版本2.14之前,這個是連接器的缺省行為. 從版本2.14以后的,缺省行為是拒絕這類輸入文件, 所以-accept-unknown-input-arch'選項被用來恢復舊的行為.-assert KEYWORD'這個選項被忽略,
28、只是用來跟SunOS保持兼容.-Bdynamic'-dy'-call_shared'連接動態鏈接庫. 這個僅僅在支持共享庫的平臺上有用.在這些平臺上,這個選項通常是默認行為. 這個選項的不同形式是為了跟不同的系統保持兼容. 你可以在命令行上多次使用這個選項:它影響緊隨其后的'-l'選項的庫搜索.-Bgroup'在動態節的'DT_FLAGS_1'入口上設置'DF_1_GROUP'標志.這會讓運行時連接器在處理在這個對象和它的相關部分搜索時只在組中. '-no-undefined'是隱式的. 這個選項只
29、在支持共享庫的ELF平臺上有用.-Bstatic'-dn'-non_shared'-static'不連接共享庫. 這個僅僅在支持共享庫的平臺上有用. 這個選項的不同形式是為了跟不同的系統保持兼容. 你可以在命令行上多次使用這個選項:它影響緊隨其后的'-l'選項的庫搜索.-Bsymbolic'當創建一個共享庫時, 把對全局符號的引用綁定到共享庫中的定義(如果有), 通常, 一個連接共享庫的程序重載共享庫中的定義是可能的. 這個選項只在支持共享庫的ELF平臺上有用.-check-sections'-no-check-sections&
30、#39;讓連接器在節地址被分配后不要去檢查節地址是否重疊.通常,連接器會執行這種檢查,如果它發現了任何重疊,它會產生相應的錯誤信息. 連接器知道也允許節的重疊. 缺省的行為可以使用命令行開關-check-sections'來恢復.-cref'輸出一個交叉引用表. 如果一個連接器位圖文件被產生, 交叉引用表被打印到位圖文件. 否則, 它被打印到標準輸出.表的格式相當的簡單, 所以,如果需要,可以通過一個腳本很輕易地處理它. 符號是以名字被打印輸出,存儲. 對于每一個符號,給出一個文件名列表. 如果符號被定義了, 列出的第一個文件是符號定義的所在. 接下來的文件包含符號的引用.-n
31、o-define-common'這個選項限制對普通符號的地址分配. 腳本命令INHIBIT_COMMON_ALLOCATION'具有同等的效果.-no-define-common'選項允許從輸出文件的類型選擇中確定對普通符號的地址分配; 否則, 一個非重定位輸出類型強制為普通符號分配地址. 使用'-no-define-common'允許那些從共享庫中引用的普通符號只在主程序中被分配地址. 這會消除在共享庫中的無用的副本的空間, 同時,也防止了在有多個指定了搜索路徑的動態模塊在進行運行時符號解析時引起的混亂.-defsym SYMBOL=EXPRESSIO
32、N'在輸出文件中建立一個全局符號,這個符號擁有一個EXPRESSION指定的絕對地址. 你可以多次使用這個選項定義多個符號. EXPRESSION支持一個受限形式的算術運算:你可以給出一個十六進制常數或者一個已存在符號的名字,或者使用'+'和'-'來加或減十六進制常數或符號. 如果你需要更多的表達式,可以考慮在腳本中使用連接器命令語言, 注意在SYMBOL,=和EXPRESSION之間不允許有空格.-demangle=style'-no-demangle'這些選項控制是否在錯誤信息和其它的輸出中重組符號名. 當連接器被告知要重組, 它會試
33、圖把符號名以一種可讀的形式的展現: 如果符號被以目標文件格式使用,它剝去前導的下劃線,并且把C+形式的符號名轉換成用戶可讀的名字. 不同的編譯器有不同的重組形式. 可選的重組形式參數可以被用來為你的編譯器選擇一個相應的重組形式. 連接器會以缺省形式重組直至環境變量COLLECT_NO_DEMANGLE'被設置. 這些選項可以被用來重載缺省的設置.-dynamic-linker FILE'設置動態連接器的名字. 這個只在產生動態連接的ELF可執行文件時有效. 缺省的動態連接器通常是正確的; 除非你知道你在干什么,不要使用這個選項.-embedded-relocs'這個選項
34、只在連接MIPS嵌入式PIC代碼時有效, 這些代碼必須是由GNU的編譯器跟匯編器通過-membedded-pic選項生成的. 它導致連接器產生一個表,這個表被用來在運行時重定位所有的被靜態初始化為指針值的數據. -fatal-warnings'把所有的警告視為錯誤.-force-exe-suffix'確保輸出文件有一個.exe后綴.如果一個被成功完整連接的輸出文件不帶有一個'.exe'或'.dll'后綴, 這個選項確保連接器把輸出文件拷貝成帶有'.exe'后綴的同名文件. 這個選項在使用微軟系統來編譯未經修改的Unix的makef
35、ile時很有用, 因為有些版本的windows不會運行一個不帶有'.exe'后綴的映像.-no-gc-sections'-gc-sections'允許對未使用的輸入節的碎片收集. 在不支持這個選項的平臺上,被忽略. 這個選項不能跟 '-r'選項共存也不能被用來進行動態連接. 缺省行為可以用-no-gc-sections'進行恢復.-help'在標準輸出上打印一個命令行選項概要,然后退出.-target-help'打印一個所有目標平臺相關的選項的概要,然后退出.-Map MAPFILE'打印一個連接位圖到文件MAPF
36、ILE中. 參閱上面關于'-M'選項的描述.-no-keep-memory''ld'通常會以速度優先于內存使用的方式優化程序,這是通過把輸入文件的符號表放在內存緩沖中實現的,這個選項告訴'ld'以內存使用優先來優化, 盡可能的減小符號表的重讀. 這在'ld'在連接一個大文件時超出內存限制時有用.-no-undefined'-z defs'通常,當創建一個非符號共享庫時, 無定義的符號允許出現,并留待運行時連接器去解決. 這個選項關閉這樣的無定義符號的使用. 開關-no-allow-shlib-undefin
37、ed'控制共享對象被連接進共享庫時的行為.-allow-multiple-definition'-z muldefs'通常,當一個符號被定義多次時, 連接器會報告一個致命錯誤. 這些選項允許重定義并且第一個定義被使用 -allow-shlib-undefined'-no-allow-shlib-undefined'允許(缺省)或不允許無定義符號存在于共享對象中. 這個開關的設置會重載'-no-undefined',這里只關注共享對象. 這樣,如果'-no-undefined'被設置,但'-no-allow-shli
38、b-undefined'未被設置, 連鎖反應是存在于規則對象文件中的無定義的符號會引起一個錯誤,但是在共享對象中的未定義的符號會被忽略.把-allow-shlib-undefined'設置為缺省的原因是在連接時指定的共享對象并不一定是載入時可載入的那個,所以,符號可能要到載入時間才被解析.-no-undefined-version'通常當一個符號有一個未定義的版本時,連接器會忽略它. 這個選項不允許符號有未定義的版本,并且碰到這種情況,會報告一個嚴重錯誤.-no-warn-mismatch'通常, 如果你因為一些原因,企圖把一些不匹配的輸入文件連接起來的時候,&
39、#39;ld'會給出一個錯誤,可能這些文件是因為由不同的處理器編譯. 這個選項告訴'ld'應當對這樣的錯誤默認允許. 這個選項必須小心使用.-no-whole-archive'為后面的檔案文件關閉'-whole-archive'選項的影響.-noinhibit-exec'當一個可執行文件還可以使用時,就保留它. 通常,連接器如果在連接過程中遇到了錯誤,就不會產生輸出文件;當它遇上錯誤時,它會退出而不寫輸出文件.-nostdlib'僅搜索那些在命令行上顯式指定的庫路徑. 在連接腳本中(包含在命令行上指定的連接腳本)指定的庫路徑都被忽
40、略.-oformat OUTPUT-formAT''ld'可以被配置為支持多于一種的目標文件. 如果你的'ld'以這種方式被配置,你可以使用'-oformat'選項來指定輸出目標文件的二進制格式.就算'ld'被配置為支持多種目標格式,你也不必指定這個項,因為'ld'應當被配置為把最常用的輸出格式作為默認格式. OUTPUT-formAT是一個文本串,是被BFD庫支持的一個特定格式的名字.腳本命令'OUTPUT_formAT'也可以指定輸出格式,但這個選項可以覆蓋它.-qmagic'這
41、個選項被忽略,只是為了跟Linux保持兼容.-Qy'這個選項被忽略,只是為了跟SVR4保持兼容.-relax'一個機器相關的選項. 只有在少數平臺上,這個選項被支持. 在某些平臺上,'-relax'選項在連接器解析程序中的地址時執行可能的全局優化, 比如松散地址模式和在輸出文件中合成新的指令.在某些平臺上,連接時全局優化會進行符號調試導致程序不能運行.在不支持這個選項的平臺上,'-relax'被接受,但被忽略.-retain-symbols-file FILENAME'只保留在FILENAME中列出的那些符號,丟棄所有其他的. FILEN
42、AME是一個簡單地平坦模式文件, 一個符號占一行.這個選項在那些會逐步積累起一個大的全局符號表的系統中(比如 VxWorks)會很有用,它能有效地節約內存空間.'-retain-symbols-file'不丟棄未定義的符號,和需要重定位的符號.你可能在命令行上只指定'-retain-symbol-file'一次, 它覆蓋'-s'和'-S'的功能.-rpath DIR'為運行時庫的搜索路徑增加一個目錄. 這個在連接帶有共享庫的ELF可執行文件時有用. '-rpath'的所有參數會被連接起來傳遞給運行時連接器,
43、 運行時連接器在運行時用它們定位共享對象. '-rpath'選項在定位那些在連接參數指定的共享對象需要的共享對象時也很有用; 參閱關于'-rpath-link'選項的描述, 如果在連接一個ELF可執行文件時不使用'-rpath'選項,那些環境變量'LD_RUN_PATH'選項就會被使用.'-rptah'選項也可以使用在SunOS上. 缺省地,在SunOS上,連接器會從所有的'-L'選項中形成一個運行時搜索路徑.如果使用了'-rpath'選項, 那運行時搜索路徑就只從'-rpa
44、th'選項中得到, 忽略'-L'選項. 這在使用GCC時非常有用, 它會用上很多的'-L'選項,而這些路徑很可能就是NFS掛上去的文件系統中.為了同ELF的連接器兼容, 如果'-R'選面后面跟有一個目錄名, 而不是一個文件名,那它也會被處理成'-rpath'選項.-rpath-link DIR'當在SunOS上使用ELF時,一個共享庫可能會用到另一個共享庫. 當'ld -share'把一個共享庫作為一個輸入文件連接時就有可能發生這種情況.當一個連接器在作非共享,不可重定位連接時,如果遇上這種依賴情況
45、,它會自動定位需要的共享庫,然后把它包含在連接中, 如果在這種情況中,它沒有被顯式包含, 那'-rpath-link'選項指定優先搜索的一組路徑名.這個選項必須小心使用,因為它會覆蓋那些可能已經被編譯進共享庫中的搜索路徑. 在這種情況下,它就有可能使用一個非內部的不同的搜索路徑.連接器使用下面的搜索路徑來定位需要的共享庫: 1. 所有由'-rpath-link'選項指定的搜索路徑. 2. 所有由'-rpath'指定的搜索路徑. '-rpath'跟'-rpath_link'的不同之處在于,由'-rpath
46、39;指定的路徑被包含在可 執行文件中,并在運行時使用, 而'-rpath-link'選項僅僅在連接時起作用. 它只用于本地連接器. 3. 在一個ELF系統中, 如果'-rpath'和'rpath-link'選項沒有被使用, 會搜索環境變量'LD_RUN_PATH'的內容.它也只 對本地連接器起作用. 4. 在SunOS上, '-rpath'選項不使用, 只搜索所有由'-L'指定的目錄. 5. 對于一個本地連接器,環境變量'LD_LIBRARY_PATH'的內容被搜索. 6. 對于一
47、個本地ELF連接器,共享庫中的DT_RUNPATH'和DT_RPATH'操作符會被需要它的共享庫搜索. 如果'DT_RUNPATH' 存在了, 那'DT_RPATH'就會被忽略. 7. 缺省目錄, 常規的,如'/lib'和'/usr/lib'.如果需要的共享庫沒有被找到, 那連接器會發出一條警告信息,并繼續執行連接.-shared'-Bshareable'創建一個共享庫. 這個選項只在ELF, XCOFF和SunOS平臺上有用。 在SunOS上,如果'-e'選項沒有被使用,并在連接中
48、有未定義的符號,連接器會自動創建一個共享庫,-sort-common'這個選項告訴'ld'當它把普通符號放到相應的輸出節中時按大小進行排序。排在最前面的是所有的一字節符號,然后是所有的二字節,然后是所有的四字節, 然后是其它的。 這是為了避免因為對齊約束而在符號間產生的斷裂-split-by-file SIZE'跟'-split-by-reloc'相似,但在SIZE達到時,為每一個輸入文件創建一個新的輸出節。如果沒有給出,SIZE缺省地設置為1-split-by-reloc COUNT'試圖在輸出文件中創建節外的節,這樣就沒有單個的輸出節
49、含有多于COUNT個重定位符。這在產生巨大的用于COFF格式的實時內核的可重定位文件時非常有用;因為COFF不能在一個節中表示多于65535個重定位。 注意,這在不支持專有節的目標文件格式中會失敗,連接器不會把單個輸入節分割進行重分配, 所以,如果單個輸入節含有多于COUNT個重定位符, 那一個輸出節會含有同樣多的可重定位符。COUNT缺省被設為32768.-stats'計算并顯示關于連接器操作的統計信息, 比如執行時間,內存占用等.-traditional-format'對于某些目標平臺, 'ld'的輸出會跟某些面有的連接器的輸出有所不同. 這個開關要求
50、9;ld'使用傳統的格式.比如, 在SunOS上, 'ld'會把符號串表中的兩上完全相同的入口合并起來. 這可以把一個帶有調試信息的輸出文件的大小減小百發之三十. 不幸地是, SunOS的'dbx'程序不能讀取這個輸出的程序(gdb就沒有問題).'-trafitinal-format'開關告訴'ld'不要把相同的入口合并起來.-section-start SECTIONNAME=ORG'通過指定ORG, 指定節在輸出文件中的絕對地址. 你可以多次使用這個選項來定位多個節. ORG必須是一個十六進制整數; 為了跟基他
51、的連接器兼容,你可以忽略前導'0x'. 注意,在SECTIONNAME,等號,ORG之間不允許有空格出現.-Tbss ORG'-Tdata ORG'-Ttext ORG'跟-section-start同義, 不過把SECTIONNAME替換為'.bss', '.data'或'.text'.-dll-verbose'-verbose'顯示'ld'的版本號,并列出支持的連接器模擬. 顯示哪些輸入文件能被打開,而哪些不能. 顯示連接器使用的連接腳本.-version-script=
52、VERSION-SCRIPTFILE'指定連接器的腳本的版本名. 這個常在創建一個需要指定附加的關于版本層次的信息的共享庫時使用,這個選項只有支持共享庫的ELF平臺上有效.-warn-common'當一個普通符號跟另一個普通符號或會號定義合并起來時,警告. 類Unix連接器允許這個選項,有時比較實用, 但是在其他的操作系統上的連接器不允許這個. 這個選項可以讓你在合并全局符號時發現某些潛在的問題. 不幸的是,有些C庫使用這項特性,所以你可能會像在你的程序中一樣,在庫中得到一些警告信息.這里給出三種類型的全局符號的解釋(用C語言): int i = 1;' 一個定義, 它
53、會存在于輸出文件中的已初始化數據節. extern int i;' 一個未定義符號,它不占用空間. 必須在另外某一處對它有一個定義,或一個普通符號 int i;' 一個普通符號.如果對于一個變量只有(一個或多個)普通符號, 它進入輸出文件的未初始化數據域. 連 接器會把同一變量的多個普通符號合并成一個單一的符號. 如果他們有不同的大小, 它采用最大的一 個. 如果是對同一變量的定義,連接器把一個普通符號轉化為一個聲明. '-warn-common'選項可以產生五種類型的警告. 每種警告由兩行組成: 第一行描述遇到的符號, 第二行描述遇到的前一個具有相同名字的符號
54、. 一個或兩個都可能成為普通符號. 1. 把一個普通符號轉化為一個引用, 因為這個符號已經有一個定義了. FILE(SECTION): warning: common of SYMBOL' overridden by definition FILE(SECTION): warning: defined here 2. 把一個普通符號轉化為一個引用,因為遇到了第二個關于符號的定義. 這跟前一種情況相同,除了符 號遇到的順序相反. FILE(SECTION): warning: definition of SYMBOL' overriding common FILE(SECTION
55、): warning: common is here 3. 把一個普通符號跟前一個相同大小的普通符號合并. FILE(SECTION): warning: multiple common of SYMBOL' FILE(SECTION): warning: previous common is here 4. 把一個普通符號跟前一個更大的普通符號合并. FILE(SECTION): warning: common of SYMBOL' overridden by larger common FILE(SECTION): warning: larger common is her
56、e 5. 把一個普通符號跟前一個更小的普通符號合并. 這跟前一種情況相同, 除了遇到的符號的順序不同. FILE(SECTION): warning: common of SYMBOL' overriding smaller common FILE(SECTION): warning: smaller common is here-warn-constructors'如果有全局結構體被使用到了,警告. 這只對很少的一些目標文件格式有用. 對于COFF或ELF格式, 連接器不同探測到全局結構體的使用.-warn-multiple-gp'如果在輸出文件中,需要多個全局指針值
57、,警告. 這只對特定的處理器有意義, 比如Alpha. 特別的,有些處理器在特定的節中放入很大的常數值. 一個特殊的寄存器(全局指針)指向這個節的中間部分, 所以通過一個基地址寄存器相關的地址模式,這個常數可以很容易地被載入. 因為這個基寄存器相關模式的偏移值是固定的而且很小(比如,16位), 這會限制常量池的最大尺寸. 所以,一個很大的問題是,為了能夠定位所有可能的常數,經常需要使用多個全局指針值. 這個選項在這種情況發生時產生一條警告.-warn-once'對于每一個未定義符號只警告一次, 而不是在每一個用到它的模塊中警告一次.-warn-section-align'如果輸
58、出節的地址因為對齊被改變了,警告. 通常, 對齊會被輸入節設置. 如果'SECTION'命令沒有指定節的起始地址, 地址就會被隱式改變.-whole-archive'對于每一個在命令行中'-whole-archive'選項后面出現的檔案文件, 在連接中包含檔案文件中的所有目標文件, 而不是為需要的目標文件搜索檔案文件. 這在把一個檔案文件轉化為一個共享庫時使用, 把所有的目標放到最終的共享庫中. 這個選項可以被多次使用.在GCC中使用這個選項需要注意兩點: 首先,GCC不知道這個選項, 所以,你必須使用'-Wl, -whole-archive
59、39;.第二, 不要忘了在你的檔案文件列表的后面使用'-Wl, -no-whole-archive',因為GCC會把它自己的檔案列表加到你的連接后面, 而這可能并不是你所預期的.-wrap SYMBOL'對SYMBOL符號使用包裝函數. 任何未定義的對SYMBOL符號的引用會被解析成'_wrap_SYMBOL'. 而任何未定義的對'_real_SYMBOL'的引用會被解析成SYMBOL.這可以用來為系統函靈敏提供一個包裝. 包裝函靈敏應當被叫做'_wrap_SYMBOL'. 如果需要調用這個函數, 那就應該調用'_
60、real_SYMBOL' 這里是一個沒什么實用價值的例子: void * _wrap_malloc (int c) printf ("malloc called with %ldn", c); return _real_malloc (c); 如果你使用'-wrap malloc'把這節代碼跟其他的代碼連接, 那所有的對'malloc'的調用都會調用'_wrap_malloc'函數. 而在'_wrap_malloc'中的'_real_malloc'會調用真正的'malloc
61、9;函數.你有可能也希望提供一個'_real_malloc'函數, 這樣,不帶有'-wrap'的連接器也會成功連接.如果你這樣做了, 你不能把'_real_malloc'的定義跟'_wrap_malloc'放到同一個文件中;如果放在一起匯編器會在連接器之前把調用解析成真正的'malloc'.-enable-new-dtags'-disable-new-dtags'連接器可以在ELF中創建一個新的動態標簽. 但是舊的ELF系統可能不理解這個. 如果你指定了'-enable-new-dtags',動態標簽會按需要被創建. 如果你指定了'-disable-new-dtags',那不會有新的動態標簽被創建. 缺省地,新的動態標簽不會被創建. 注意這些選項只在ELF系統中有效.i386 PE平臺的特定選項.-i386 PE連接器支持'-shared'選
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 遇事冷靜2025年公共衛生執業醫師考試試題及答案
- 力敏陶瓷企業ESG實踐與創新戰略研究報告
- 吸收器(塔)企業數字化轉型與智慧升級戰略研究報告
- 不銹鋼調味汁壺、調味品瓶企業數字化轉型與智慧升級戰略研究報告
- 廂式客車企業ESG實踐與創新戰略研究報告
- 電影洗印用裝置和設備零件企業數字化轉型與智慧升級戰略研究報告
- 多參數綜合測量儀器企業數字化轉型與智慧升級戰略研究報告
- 紡織裝備企業縣域市場拓展與下沉戰略研究報告
- 快速重載鐵路機車用車軸鋼企業縣域市場拓展與下沉戰略研究報告
- 冷軋電工鋼板帶企業縣域市場拓展與下沉戰略研究報告
- 2024年浙江省《輔警招聘考試必刷500題》考試題庫及答案【考點梳理】
- 2025年中鐵開投、中鐵云投招聘筆試參考題庫含答案解析
- 《如何帶教新人》課件
- 2024年05月江蘇省昆山鹿城村鎮銀行2024年社會招考筆試歷年參考題庫附帶答案詳解
- 2024四川省火鍋行業發展白皮書
- 《食管基本解剖》課件
- 肝門膽管癌手術配合步驟
- DB36T 1179-2019 政務數據共享技術規范
- 《腫瘤與營養》課件
- 食品安全與傳染病預防
- 市政基礎設施施工現場綠色施工管理臺賬
評論
0/150
提交評論