版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
LDS你寫了系列令作為個連接.每個命令是個帶有參數(shù)的關鍵字,或者是個對符號的賦值.你可以用分號分隔命令.空格般被忽略.般可以被直接鍵入.比如般作為分隔文件名用的逗號,你可以把文件名放到雙引號中.文件名中間無法使用雙引號. 樣,在連接中使用注釋,用'/*'和'*/'隔開.就像在C中,注釋在語法上等同于空格.可能的最簡單的只含有個命令:SCIONS'.你可以使用SCTION來描述輸出文件的內存布局.'ECTON'是個功能很強大令.這里這們會描述個很簡單的使用.讓我們假設你的程序只有代碼節(jié),,.這些會存在于text,.ata和'.s節(jié),另外,讓我們進對于這個例子,我們說代碼應當被載入到地址'0x10000'處, 而數(shù)據(jù)應當從0x 處開始.下面是 {.=.text:{*(.text).= .data:{*(.data).bss:{*(.bss)}使用關鍵字EO寫了這個ETIONS命令,后面跟有第行 個特殊的符號'.'賦值,這是個定位計數(shù)器.如果你沒有以其它的方式指定輸出節(jié)的地址(其他方式在后面會描述),那地址值就會被設為定位計數(shù)器的現(xiàn)有值.定位計數(shù)器然后被加上輸出節(jié)的尺寸.在'ECTONS'命令的開始處,定位計數(shù)器擁有值0.第二行定義個輸出節(jié),'.text'.冒號是語法需要,現(xiàn)在可以被忽略.節(jié)名后面的花括號中,你列出所有應當被放入到這個輸出節(jié)中的輸入節(jié)的名字.*是個通配符,匹配任何文件名.表達式(tt)意思是所有的輸入文件中的'.tet'因為當輸出節(jié)'tet定義的時候,定位計數(shù)器的值是'0x10000'連接器會把輸出文件中的'tet節(jié)的地址設第三行定義了輸出文件中的'.ata節(jié)和bss節(jié).連接器會把'.ata輸出節(jié)放到地址0x '處.連接器放好dta輸出節(jié)之后,定位計數(shù)器的值是 '加上dta輸出節(jié)的長度.得到的結果是連接器把'.b'輸出節(jié)放到緊接data'節(jié)后面的位置.連接器會通過在必要時增加定位計數(shù)器的值來保證每個輸出節(jié)具有它在這個例子中,為ext和'.ata.ata'和bss節(jié)之間創(chuàng)建就這樣,這是個簡單但完整的連接.簡在本章中,我們會描述些簡單的命令.設置點. 個被執(zhí)行到的指令稱為"點".你可以使用'ENTRY'連接命令來設置點.參數(shù)是 有多種不同的方法來設置點.連接器會通過按順序嘗試以下的方法來設置點 -'命令行選項連接中的ENTRYSYBOL命令如果定義了start,就使用start如果存在,就使用'tet'地址處理文件令NUDFLENME'在當前點包含連接文件FLENE.在當前路徑下或用'-L'選項指定的所有路徑下搜索這個文件,.INU(ILE,E,INUT(ILEFILEINPUT命令指示連接器在連接時包含文件,就像它們是在命令行上指定 樣比如,如果你在連接的時候總是要包含文件subro',你就可以在你的連接中輸入NUT(事實上,如果你喜歡,你可以所有的輸入文件列在連接中,然后在連接的時候什么也不需要,只要個'T'選項就夠了. 下,文件名就會被在系統(tǒng)根前綴下搜索.否則連接器就會企圖打開當前 件.如果沒有發(fā)現(xiàn),連接器會通過庫搜索路徑進行搜索.如果你使用了'NUT(-FILE','d'會把文件名轉換為'ibILEa',就象命令行參數(shù)-l'樣.當你在個隱式連接中使用INPUT'命令的時候,文件就會在連接時連接文件被包含的點上被包含進來.這會影響到搜索.RUP(LE,IGOU(ILEFILE除了文件必須全是文件之外,GROU'命令跟NU相似,它們會被反復搜索,直至沒有未定義的OTT命令命名輸出文件.在連接中使用TPTFILEME)'命令跟在命令行中使用'-oENAE命令是完全等效的.如果兩個都使用了,那命令行選項優(yōu)先.你可以使用OUTUT.out'.SEARCHIP)SEARCHDR命令給'ld用于搜索文件的路徑中再增加新的路徑.使用SEARCHAH)跟在命令行上使用'-LATH選項是完全等效的.件是在命令行上第個被指定的文件樣.如果在個系統(tǒng)中,點總是存在于第個文件中,那OUTPUTrADAMOUTPUTADUBG' AT命令為輸出文件使用的BFD格式命名.使用OUTPUT 使用'-oaBDNAE是完全等效的.如果兩個都使用了,命令行選項優(yōu)先.你可在使用OUTPUT rmAT時帶有三個參數(shù)以使用不同的基于'-B'和'-L'令行選項的格式.如果'-B和'-EL都沒有使用,那輸出格式會是第個參數(shù)DET,如果使用了'-EB,輸出格式會是第二個參數(shù)I如果使用了'-EL',輸出格式會是第三個參數(shù),TL比如,缺省的基于IPSELF平臺連接使用如下命令OUTPUTormAel32-igms,el32-igms,el32-)這表示缺省的輸出文件格式是'l32-iis,但是當用戶使用'-L被以el32-littlems'格式創(chuàng)建.'TARGET命令在輸入文件時命名BFD格式.它會影響到后來的NPUT和GU命令.這個命令跟-bNAM相似.如果使用了TARGETOUTPUTrmAT沒有指定,最后的還有些其它的連接命令.RX確保EXP不等于零,如果等于零,連接器就會返回個錯誤碼退出,并打印出ESAGE.強制SYMBOL作為個無定義的符號輸入到輸出文件中去.這樣做了,可能會從標準庫中連接些節(jié)外的庫.你可以為每個TEN列出幾個符號,而且你可以多次使用'XTEN'.這個命令跟'-u'命COMMONLTI'這個命令跟命令行選項'-'具有相同的效果:就算指定了個可重定位的輸出文件('-r'),也讓d'IHIITCOMMON這個命令跟命令行選項--no- m'具有相同的效果:就算是個不可重位輸出文件,也NOCROSSREFS(SECTIONSECTION...)'這個命令在遇到在某些特定的節(jié)之間的時候會產(chǎn)生條錯誤信息在某些特定的程序中,特別是在使用覆蓋技術的嵌入式系統(tǒng)中,當個節(jié)被載入內存時,另外個節(jié)就不會在內存中.任何在兩個節(jié)之間的直接都會是個錯誤.比如,如果節(jié)1中的代碼調用了另個節(jié)中的個函數(shù),這就會產(chǎn)生個錯誤.NOCOSSEF'命令帶有個輸出節(jié)名字的列表.如果ld'遇到任何在這些節(jié)之間的交叉,它就會報告?zhèn)€錯誤,并返回個非零退出碼.OOE命令使用輸出節(jié)名,而不是輸入節(jié)名.OUTPUTRCHBRC)'指定個特定的輸出機器架構.這個參數(shù)是BFD庫中使用的個名字.你可以通過使用帶有'-'選項的ojump'程序來查看個目標文件的架構.你可以在個連接中為個符號賦個值.這會把個符號定義為個全局符號.你可以使用所有的C賦值符號為個符號賦值.SYMBOL+=EXPRESSION;'SYMBOL-=EXPRESSION;'SYMBOL*=EXPRESSION;'SYMBOL/=EXPRESSION;'SYMBOL<<=EXPRESSION;'SYMBOL>>=EXPRESSION;'SYMBOL&=EXPRESSION;'SYMBOL=EXPRESSION;'第個情況會把SYMBOL定義為值PSION.其它情況下,SYMBOL必須是經(jīng)定義了的,而值會作出相應的調'ECTON'命令中使用它.你在寫表達式賦值的時候,可以把它們作為單獨的部分,也可以作為ETIONS命令中 'ECTIONS命令中輸出節(jié)描述的個部分.loatingpoint=0;{{etext=.;}bdata=(.+3)&~.data:{*(.data)}在這個例子中,符號loatingoit被定義為零.符號'-etet會被定義為前面?zhèn)€.ex節(jié)尾部的地址.而符號'bdaa會被定義為.et輸出節(jié)后面的個向上對齊到4字節(jié)邊界的個地址值. 個符號被到的時候只在連接中定義,而不在任何個被連接進來的目標文件中定義.這種做法是比較明智的.比如,傳統(tǒng)的連接器定義了個符號etet'.但是,NC需要用戶能夠把etet'作為個函數(shù)使用而不會產(chǎn)生錯誤.ROVDE關鍵字可以被用來定義個符號,比如etet',這個定義只在它被到的時候有效,而在它被定義的時候無效.語法是RDE(YO=XRSION).下面是個關于使用PDE'定義eet'的例子:{{etext=.;OVIDE(eet=}}在這個例子中,如果程序定義了個'eext'帶有個前導下劃線),連接器會給出程序定義了個'tet(不帶前導下劃線),連接器會默認使用程序中的定義.如果程序了etet'但不定義它,連接器會使用連接中的定義.ETIONS命令告訴連接器如何把輸入節(jié)映射到輸出節(jié),并如何把輸出節(jié)放入到內存中.{}每 個'NTRY'ENTRY'命令和符號賦值在'SECTION'命令中是允許的,這是為了方便在這些命令中使用定位計數(shù)器.這也可以讓連接腳本更容易理解,因為你可以在更有意義的地方使用這些命令來控制輸出文件的布局.如果你在連接中不使用'ECTONS'命令,連接器會按在輸入文件中遇到的節(jié)的順序把每個輸入節(jié)放到同名的輸出節(jié)中.如果所有的輸入節(jié)都在第個文件中存在,那輸出文件中的節(jié)的順序會匹配第個輸入文件中的節(jié)的順序.第個節(jié)會在地址零處.SECTIONDRES]TPE)]:[TLMA{}>REGN]AT>LMAREGION][HDR:PDR...]]SECTION邊上的空格是必須的,所以節(jié)名是明確的.冒號跟花括號也是必須的.斷行和其他的空格是可選的.每個 輸出節(jié)的名字是SCION.ETION必須滿足你的輸出格式的約束.在個只支持限制數(shù)量的節(jié)的格式中,比如aout,這個名字必須是格式支持的節(jié)名中的個(比如,'a.out'只允許et,.aa或'.ss).如果,a.個含有任意非常用字符.ADDRESS是關于輸出節(jié)中VMS的個表達式.如果你不提供ADDES,連接器會基于RO如果存在)設置它,或如果你提供了ADE那輸出節(jié)的地址會被精確地設為這個值.如果你既不提供ADDRESS也不提供GN那輸出節(jié)的地址會被設為當前的定位計數(shù)器向上對齊到輸出節(jié)需要的對齊邊界的值.輸出節(jié)的對齊要求是所有輸入節(jié)中含有的對齊要求中最嚴格的個..text.:{*(.text)和.text:{*(.text)個會把.ext當前值向上對齊到.ext輸入節(jié)中對齊要求最嚴格的個邊界.ADDRESS可以是任意表達式;比如,如果你需要把節(jié)對齊對0x10字節(jié)邊界,這樣就可以讓低四字節(jié)的節(jié)地址值為零,你可以這樣做:.textALIGN(0x10):{*(.text)這個語句可以正常工作,因為ALIGN'返回當前的定位計數(shù)器并向上對齊到指定的值.指定個節(jié)的地址會改變定位計數(shù)器的值.輸入節(jié)描述是最基本的連接操作.你使用輸出節(jié)來告訴連接器在內存中如何布局你的程序.你使用輸入節(jié)來.文件名和節(jié)名可以通配符形式出現(xiàn),這個我們以后再介紹.最常用的輸入節(jié)描述是包含在輸出節(jié)中的所有具有特定名字的輸入節(jié) 比如 這里'*是個通配符,匹配所有的文件名.為把部分文件排除在匹配的名字通配符之外,EXCLUDEFILE可以用來匹配所有的除了在EXCLUDEFILE列表中指定的文件.比如:(*(EXCLUDEFILE(*crtend.o*otherile.o)會讓除了crtendo'文件和otherileo文件之外的所有的文件中的所有的.ctors*(.text*(.text)上面兩句的區(qū)別在于'tet'和rata輸入節(jié)的輸出節(jié)中出現(xiàn)的順序不同.在第個例子中,兩種節(jié)會交替出現(xiàn),并以連接器的輸入順序排布.在第二個例子中,所有的'tet'輸入節(jié)會先出現(xiàn),然后是所有的.aa節(jié). 個特定的文件中包含節(jié).如果 殊的定位,你可以這樣做.比如:如果你使用個不帶有節(jié)列表的文件名,那輸入文件中的所有的節(jié)會被包含到輸出節(jié)中.通常不會這樣做,但是在某些場合下這個可能非常有用.比如:NUT'命令中.如果你沒有,連接器會試圖把這個文件作為個輸入文件打開,就像它在命令行上出現(xiàn)樣.注意這跟INPUT命令不樣,因為連接器會在搜索路徑中搜索文件.文件名通配符*在很多例子中都可以看到,這是個簡單的文件名通配符形式.通配符形式跟UixS中使用的樣.匹配CHARS中的任意單個字符;字符'-'可以被用來指定字符的方訌,比如[a-z]當,通配符字符不會匹配個'/'字符(在UNIX系統(tǒng)中用來分隔名),個含有單個*'字符的形式是個例外它總是匹配任意文件名不管它是否含有'/'.在,通配符字文件名通配符只匹配那些在命令行或在'NUT'命令上顯式指定的文件.連接器不會通過搜索如果個文件名匹配多于個通配符,或者如果個文件名顯式出現(xiàn)同時又匹配了個通配符,連接器會使用第次匹配到的連接.比如,下面的輸入節(jié)描述序列很可能就是錯誤的,因為'ata.'規(guī)則沒有被使用:.data:{*(.data).data1:{data.o(.data)通常,連接器會把匹配通配符的文件和節(jié)按在連接中被看到的順序放置.你可以通過SOT'關鍵字改變它,它出現(xiàn)在括號中的通配符之前(比如,'ORT(.et*'.當'ORT'關鍵字被使用時,輸出文件中之前按名字順序重新排列它們.如果你對于輸入節(jié)被放置到哪里去了感到很困惑,那可以使用'-M連接選項來產(chǎn)生個位圖文件.位圖文件會這個例子顯示了通配符是如何被用來區(qū)分文件的.這個連接指示連接器把所有的.txt節(jié)放到.et中,把所有的.bss節(jié)放到bs.連接器會把所有的來文件名以個大寫字母開始的文件中的.aa節(jié)放進.DATA節(jié)中;對于所有其他文件,連接器會把.aa節(jié)放進.aa節(jié)中.NS.text:{*(.text)DATA:{AZ](.ata).data:{*(.data).bss:{*(.bss)}對于普通符號,需要個特殊的標識,因為在很多目標格式中,普通符號沒有個特定的輸入節(jié).連接器會把普通符號處理成好像它們在個叫做OMMON'的節(jié)中.你可能像使用帶有其他輸入節(jié)的文件名樣使用帶有'OMON'節(jié)的文件名。你可以通過這個把來個特定輸入文件的普通符號放入個節(jié)中,同時把來其它輸入文件的普通符號放入另個節(jié)中。.bss{*(.bss)OMON)有些目標文件格式具有多于個的普通符號。比如,MPSELF目標文件格式區(qū)分標準普通符號和小普通符號。在這種情況下,連接器會為其他類型的普通符號使用個不同的特殊節(jié)名。在MISELF的情況中,連接器為標準普通符號使用'OMMON',并且為小普通符號使用'comon。這就允許你把不同類型的普通符號映射到內存的不同位置。在些老的連接上,你有時會看到[O]。這個符號現(xiàn)在經(jīng)過時了,它等效于*COMMON'時用標該的用這符或。接下來的例子是個完整的連接。它告訴連接器去文件alo中的所有節(jié),并把它們放到輸出節(jié)ouua的開始位置處,該輸出節(jié)是從位置0x10000處開始的。從文件'o.中來的所有節(jié).ipt1'在同個輸出節(jié)中緊密排列。從文件'oo.o中來的所有節(jié).u2全部放入到輸出節(jié)otptb中,后面跟上從'oo1o'中來的節(jié).npu1。來所有文件的所有余下的'.npu1和'.npu2節(jié)被寫入到輸出節(jié)NSoutputa0x10000{oo.o}outputb{oo.o(.input2)oo1.o}outputc{}}你可以通過使用輸出節(jié)命令YTOOGQD或者UD每個關鍵字后面都跟上個圓括號中的要存入的值。表達式的值被存在當前的定位計數(shù)器的值處?!瓸YTE’,‘SHORT’,‘LONG’‘QUAD’命令分別個,兩個,四個,八個字節(jié)。存入字節(jié)后,定位計數(shù)器的值加比如,下面令會存 系統(tǒng)都是32位的,個表達式就會被作為32位計算。在這種情況下,‘QUAD’個32位值,并把它零擴展到64位,而‘SQUAD’會把32位值符號擴展到64位。如果輸出文件的目標文件格式有個顯式的enaness,它在正常的情況下,值就會被以這種edaess當個目標文件格式?jīng)]有個顯式的edaness時,值就會被以第個輸入目標文件的enaness。注意,這些命令只在個節(jié)描述內部才有效,而不是在它們之間,所以,下面的代碼會使連接器產(chǎn)生個錯誤信SECTIONS{.text:{*(.text)}LONG().data:{*(.data)}SECTIONS{.text:{*(.text);LONG(1)}.data:{*(.data)}你可能使用‘FLL’命令來為當前節(jié)設置填充樣式。它后面跟有個括號中的表達式。任何未指定的節(jié)內內存區(qū)域(比如,因為輸入節(jié)的對齊要求而造成的裂縫)會以這個表達式的值進行填充。個'FLL'它本身在節(jié)定義中出現(xiàn)的位置后面的所有內存區(qū)域;通過引入多個‘FLL’語句,你可以在輸出節(jié)的不同位置擁有不同的填充樣式。這個例子顯示如何在未被指定的內存區(qū)域填充 ‘ILL’命令跟輸出節(jié)的‘=ILEXP’屬性相似,但它只影響到節(jié)內跟在‘ILL整個節(jié)。如果兩個都用到了,那‘ILL’命令優(yōu)先。CREATEOBJECT這個命令告訴連接器為每個輸入文件創(chuàng)建個符號。而符號的名字正好就是相關輸入文件的名字。而每個符號的節(jié)就是CREATEOBJECTSYBLS命令出現(xiàn)的那個節(jié)。這個命令直是a.out當使用a.out目標文件格式進行連接的時候,連接器使用 和析構函數(shù)。當連接不支持專有節(jié)的目標文件格式時,比如ECOFF和XCOFF,連接器會動辯識C++全符號 CTORLIST'標識全局構造函數(shù)的開始,而符號 DTORLST'標識結束。這個列表的第WOD是的數(shù)量,緊跟在后面的是每個構造函數(shù)和析構函數(shù)的地址,再然后是個零WORD。編譯器必須安排如何實際運行代碼。對于這些目標文件格式,GNU++通常從個 an'子程序中調用構造函數(shù),而對 an'的調用動入到an'的啟動代碼中。GNU++通常使用aext'運行析構函數(shù),或者直接從函數(shù)'ext'中運行。對于像‘OFF’或‘ELF’這樣支持專有節(jié)名的目標文件格式,GNU++函數(shù)的地址值放到cts'和'.tos'節(jié)中。把下面的代碼序列放到你的連接中去,這樣會構建出GNU++運行時代碼希望見到的表類型。CTOR =(CTOR CTORLIST)/4-CTOREND=.;DTORLIST=(DTOR DTORLIST)/4-DTOR =如果你正使用GNUC++代為OT(ONTUTOR)。當使用.trs和s節(jié)時,使用(ORT(crs))'和(OR(.trs))'而不是*(ctors)'和*(dtrs)'通常,編譯器和連接器會動處理這些事情,并且你不必親關心這些事情。但是,當你正在使用C++,并己編寫連接時,你可能就要考慮這些事情了。連接器不會創(chuàng)建那些不含有任何內容的輸出節(jié)。這是為了那些可能出現(xiàn)或不出現(xiàn)在任何輸入文件中的輸入.oo{*(.oo)如果至少在個輸入文件中有'.oo節(jié),它才會在輸出文件中創(chuàng)建個'.oo如果你使用了其它的而不是個輸入節(jié)描述作為個輸出節(jié)命令,比如個符號賦值,那這個輸出節(jié)總是被創(chuàng)建,/ICR//ICR/的輸出節(jié)中的輸入SECTION[ADDRS]TPE)]:{}>REGN]AT>LMAREGION][HDR:PDR...]]我們經(jīng)介紹了SET,ADDES,和 AD在這節(jié)中,介紹余下的節(jié)屬性。輸''可分配,所以當程序運行時,沒有內存為這個節(jié)分配。比如,在下面的例子中,‘OM’節(jié)被定址在內存地址零處,并且在程序運行時不需要被載入?!甇M’節(jié)的內容會正常出現(xiàn)在連接輸出文件中。NSROM0NOLOAD):{...}輸出節(jié)每個節(jié)有個虛地址(VMA)和個載入地址(LMA);出現(xiàn)在輸出節(jié)描述中的地址表達式設置LMA指定節(jié)的載入地址。或者,通過AT>LMARGION表達式,你可以為節(jié)的載入地址指定個內存區(qū)域。這個特性是為了便于建立ROM映像而設計的。比如,下面的連接創(chuàng)建了三個輸出節(jié):個叫做‘tet’從地址‘0x1000’處開始,個叫‘maa’,盡管它的VMA是0x000,它會被載入到'tet'節(jié)的后面,最后個叫做‘bss’是用來放置未初始化的數(shù)據(jù)的,其地址從'0x3000處開始。符號'dta被定義為值'0x200',它表示定位計數(shù)器的值是VMA的值,而不是A。{.text0x1000:{*(.text)etext=.;.daa0x2000AT(ADDR(.text)+SIZEOF(.text){data=.;*(.data);edata=.;.bss0x3000{bstart=.;*(.bss)(OON);bend=.}這個連接產(chǎn)生的程序使用的運行時初始化代碼會包含象下面所示的些東西,以把初始化后的數(shù)據(jù)從ROM映externcharetext,data,edata,bstart,bend;char*src=&etext;char*dst=&/*ROMhasdataatendotext;copyit.*/wie(dst<&edata){s++=;}/*Zerobssor(dst=&bstart;t<&bend;)*dst=你可以通過使用>REGION把個節(jié)賦給前面經(jīng)定義的個內存區(qū)域。這里有個簡單的例子:SECTIONS{ROM:{*(.text)}>m}輸出節(jié)你可以通過使用:HDR'把個節(jié)賦給前面定義的個程序段。如果個節(jié)被賦給個或多個段,那后來分配的節(jié)都會被賦給這些段,除非它們顯式使用了:HD'修飾符。你可以使用NONE'來告訴連接器節(jié)放到任何個段中。這兒有個簡單的例子:PHDRS{textPTLOAD;SECTIONS{.text:{*(.text)}:text你可以通過使用'=FLLEP'為整個節(jié)設置填充樣式。LX是個表達式。任何沒有指定的輸出段內的內存區(qū)域(比如,因為輸入段的對齊要求而產(chǎn)生的裂縫)會被填入這個值。如果填充表達式是個簡單的十六進制值,比如,個以'0x開始的十六進制數(shù)字組成的字符串,并且尾部不是k'或M,那個任意的十六進制數(shù)字長序列可以被用來指定填充樣式;前導零也變?yōu)闃邮降牟糠?。對于所有其他的情況,包含個附加的括號或元操作符+,那填充樣式是表達式的最低四字節(jié)的值。在所有的情況下,數(shù)值是big-endian.這里是個簡單的例子:SECTIONS{.text:{*(.text)} 內存地址運行的節(jié)。在運行時,些覆蓋管理機制會把要被覆蓋的節(jié)按需要拷入或拷出運行時內存地址,覆蓋是通過‘OVERLAY’命令進行描述?!甇VERLAY’命令在‘SCOS’命令中使用,就像輸出段描述樣。OVERLAYSTART]:NOOSE]AT(LDADDR{{
}[:PH.][=FILL]{
}[:PH.]}[>REGION][:PH.]除了‘OVERLAY’關鍵字,所有的都是可選的,每個節(jié)必須有個名字(上面的 節(jié)都被定義為同個開始地址。所有節(jié)的載入地址都被排布,使它們在內存中從整個OVERLAY'的載入地址開始都是連續(xù)的(是當前的定位計數(shù)器的值。)如果使用了關鍵字NOOSEFS,并且在節(jié)之間存在,連接器就會報告?zhèn)€錯誤。因為節(jié)都運行在同個地址上,所以個節(jié)直接另個節(jié)中的內容是錯誤的。對于OELY'中的每個節(jié),連接器動定義兩個符號。符號loadstart A地址。符號loadstop AE被定義為節(jié)的最后載入地址。AME中的不符合C規(guī)定的任何字符都將被在覆蓋區(qū)域的最后,定位計數(shù)器的值被設為覆蓋區(qū)域的開始地址加上最大的節(jié)的長度。這里是個例子。記住這只會出現(xiàn)在‘SECTIONS’結構的內部。OVERLAY0x1000:AT{.text0{o1/*.o(.text).text1{o2/*.o(.text)}loadstopet0', loadstartet1', loadstope.externchar loadstarttext1, loadstoptext1;memcpy((char*)0x1000,&loadstarttext1,&loadstoptext1-&loadstart注意OVELAY'命令只是為了語法上的便利,因為它所做的所有事情都可以用更加基本令加以代替。上的例子可以用下面的完全特效的寫法:.text00x1000:AT(0x4000){o1/*.o(.text)}loadstarttext0=LOADADDR(.text0);loadstoptext0=LOADADDR(.text0)+SIZEOF.text10x1000:AT(0x4000+SIZEOF(.text0)){o2/*.o(.text)}loadstarttext1=LOADADDR(.text1);loadstoptext1=LOADADDR(.text1)+SIZEOF.=0x1000+MAX(IZEOF(.text0),SIZEOF連接器在缺省狀態(tài)下被配置為允許分配所有可用的內存塊。你可以使用‘MEMOY’命令重新配置這個設置?!甅EORY’命令描述目標平臺上內存塊的位置與長度。你可以用它來描述哪些內存區(qū)域可以被連接器使用,哪些內存區(qū)域是要避免使用的。然后你就可以把節(jié)分配到特定的內存區(qū)域中。連接器會基于內存區(qū)域設置節(jié)的地址,對于太滿的區(qū)域,會提示警告信息。連接器不會為了適應可用的區(qū)域而攪亂節(jié)。個連接最多可以包含次MEO命令。但是,你可以在命令中隨心所欲定義任意多的內存塊,語法{NAMEATTR]:OIGIN=RN,LENGTH=}NAME是用在連接中內存區(qū)域的名字。出了連接,區(qū)就沒有任何實際意義。區(qū)在個單獨的名字空間中,它不會和符號名,文件名,節(jié)名產(chǎn)生,每塊內存區(qū)域必須有個唯的名字。ATTR字符串是個可選的屬性列表,它是否為個沒有在連接中進行顯式映射地輸入段使用個特定的內存區(qū)域。如果你沒有為某些輸入段指定個輸出段,連接器會創(chuàng)建個跟輸入段同名的輸出段。如果你定義了區(qū)域屬性,連ATTR字符串必須包含下面字符中的個,且必須只包含個:同對前個屬性值取反。如果個未映射節(jié)匹配了上面除'!'之外的個屬性,它就會被放入該內存區(qū)域。'!'屬性對該測試取反,所以只有當它不匹配上面列出的行何屬性時,個未映射節(jié)才會被放入到內存區(qū)域。ORGN是個關于內存區(qū)域地始地址的表達式。在內存分配執(zhí)行之前,這個表達式必須被求值產(chǎn)生這意味著你不可以使用任何節(jié)相關的符號。關鍵字'OIGN'可以被縮寫為org或'o(但是,不可以寫為,比如‘ORG’)LEN是個關于內存區(qū)域長充(以字節(jié)為單位)的表達式。就像OGN表達式,這個表達式在分配執(zhí)行前也必須被求得為個常數(shù)值。關鍵字NGH可以被簡寫為‘e或'l'。在下面的例子中,我們指定兩個可用于分配的內存區(qū)域 個從b{m(rx):ORIIN=0,LENGTH=a(!rx):org= ,l=}旦你定義了個內存區(qū)域,你也可以指示連接器把指定的輸出段放入到這個內存區(qū)域中,這可以通過使用個名為果沒有為輸出段指定地址,連接器就會把地址設置為內存區(qū)域中的下個可用的地址。如果總共的映射到個內存區(qū)域的輸出段對于區(qū)域來說太大了,連接器會提示條錯誤信息。PHDRSELF你可以通過使用帶有-p'選項的‘bjump’命令來打印出這個程序頭。當你在個純ELF系統(tǒng)上運行ELF程序時,系統(tǒng)的載入程序通過文件頭來計算得到如何來載入這個文件。只在程序頭被正確設置的情況下才會正常工作。本手冊并不打算介紹系統(tǒng)載入程序如何解釋文件頭的相關細節(jié)問題;關于信息,請參閱ELFABI。連接順在缺省狀態(tài)下會己創(chuàng)建個可用的程序頭。但是,在某些情況下,你可能需要更為精確地指定程序頭。你可以使用命令‘PHDRS’達到這個目的。當連接器在連接中看到‘PHDRS’命令時,它只會創(chuàng)建被指定了的程{NAMETYPE[FILEHDR][PHDRS][AT(ADDRESS)][FLAGS(FLAGS)];}的名字空間中。每個程序頭都必須有個唯的名字。某些特定類型的程序頭描述系統(tǒng)載入程序要從文件中載入到內存的節(jié)。在連接中,你通過把可載入的輸出節(jié)到段中來指定這些段的內容。你可以使用‘PHDR’輸出節(jié)屬性把個節(jié)放到個特定的段中。把某些節(jié)放到多個段中也是正常的。這僅僅暗示了個內存段中含有另個段。你可以重復使用:H在每個應當含有這個節(jié)的段中使用它次。如果你使用‘’把個節(jié)放到多個段中,那連接器把隨后的所有沒有指定‘:HDR’的可分配節(jié)都放到同個段中。這是為了方便,因為通常串連續(xù)的節(jié)會被放到個單獨的段中。你可以使用‘:NOE’來覆蓋缺省的段,告訴連接器節(jié)放到任何個段中。你可能在程序頭類型后面使用‘HDR’和‘PHDRS’關鍵字來進步描述段的內容?!瓾DR’關鍵字表示TYPEPTU(表示個不用的程序頭。PTOD(PTDYNAC'(表示個可以從中找到動態(tài)信息的段PTIP(PTNTE'表示個存有備注信息的段。PTSLB'(個保留的程序頭類型,被定義了,但沒有被ELFB指定。PTR(6)你可以通過使用‘AT’表達式指定個當被載入到內存中的個特定的地址。這跟在輸出節(jié)屬性中使用‘AT’命令是完全樣的。程序頭中的‘AT’命令會覆蓋輸出節(jié)屬性中連接器通常會基于組成段的節(jié)來設置段屬性。你可以通過使用‘’關鍵字來顯式指定段標志。S的值必須是個整型值。它被用來設置程序頭的‘plags域。這里是個關于‘PHDRS’的例子。它展示個在純ELF系統(tǒng)上的個標準的程序頭設置。{interpPTTE;textPTLOADILEHDRPHDRSdataPTLOAD;cC}{.=SIZEOF.interp:{*(.interp)}:text.text:{*(.text)}.rodata:{*(.rodata)}/*deaultsto:text.=.+0x1000;/*movetoanewpageinem.data:{*(.data)}ya:{*(.dyamc)}:datac}VEON在使用ELF時,連接器支持符號版本。符號版本只在使用共享庫時有用。動態(tài)連接器在運行個可能跟個更早版本的共享庫程序時,可以使用符號版本來選擇個函數(shù)的特定版本。你可以直接在主連接中包含個版本,或者你可以以個隱式連接的形式提供這個版N’VERSION mands版本命令的格式跟Sun在Sars.5中的連接器的格式是完全樣的。版本定義節(jié)點樹。你可以在版本中指定節(jié)點名和依賴關系。你可以指定哪些符號被綁定到哪些版本節(jié)點上,你還可以把最簡單的演示版本語言的方法是出示幾個小例子:VERS1.1;VERS1.2}VERSVERS2.0bar1;}VERS這個示例版本定義了三個版本節(jié)點。第個版本節(jié)點定義為‘VERS1’它沒有其它的依賴。腳本把符號‘oo1’綁定給‘VERS1’。它 些數(shù)量的符號限定到本地范圍,這樣它們在共 下面,版本定義個節(jié)點‘VER12’。這個節(jié)點依賴‘VER1’。把符號‘oo2’綁定給節(jié)點‘VERS1.2’。最后,版本定義節(jié)點‘VERS20’。這個節(jié)點依賴‘VERS12’。把符號‘bar1’和‘bar2’綁定給版本節(jié)點‘VERS’?;A版本的庫。你可以通過使用‘global:*;’把所有未指定的符號綁定到個給定的版本節(jié)點版本節(jié)點的名字沒有任何特殊的含義只是為了方便人們閱讀。版本’可以出現(xiàn)在’和‘.’之間。但是,在書寫版本時,這會是個引起的辦法。如果在版本中,這是個唯的版本節(jié)點,節(jié)點名可以被省略。這樣的版本不給符號賦任何{global:oo;bar;local:*;當你把個程序跟個帶有版本符號的共享庫連接時,程序身知道每個符號的哪個版本是它需要的,而且它還知道它連接的每個節(jié)享庫中哪些版本的節(jié)點是它需要的。這樣,在運行時,動態(tài)載入程序可以做個快速的確認,以保證你連接的庫確實提供了所有的程序需要用來解析所有動態(tài)符號的版本節(jié)點。用這種方法,就有可能讓每個動態(tài)連接器知道所有的外部符號不需要通過搜索每個符號就能解析。符號版本在SunOS上做次版本確認是種很成方法。個被提出來的基本的問題是對于外部函數(shù)的標準會在需要時被綁定到正確的版本,但不是在程序啟動的時候全部被綁定。如果個共享庫過期了,個需要的界面可能就不存在了;當程序需要使用這個界面的時候,它可能會用戶會得到條警告信息。GNU對Sun的版本確認辦法有些擴展。首先就是能在符號定義的源文件中把個符號綁定到個版本節(jié)點而不是在個版本中。這主要是為了減輕庫的工作量。你可以通過類似下面的代碼實現(xiàn)這點:asm(smeroriginaloo,oo@VERS在C源文件中。這句會給函數(shù)'riialoo'取個別名'oo,并綁定到版本節(jié)點VERS11'。操作符lca:'可以被用來符號oiginaloo被導出。操作符'syme'使這句優(yōu)先于版本。第二個GNU的擴展是在個給定的共享庫中允許同個函數(shù)的多個版本。通過這種辦法,你可以要實現(xiàn)這個,你必須在個源文件中多次使用.ymver操作符。這里是個例子:asm"smeroriginaloo,@);asm(smroldoo,oo@VERSasm(smroldoo1,oo@VERS1.2");asm("smernewoo,oo@@VERS2.0");在這個例子中,'oo@表示把符號'oo綁定到個沒有指基版本的符號上。含有這個例子的源文件必須定義4個C函數(shù):originalo,oldo,oldoo1',和newoo.當你有個給定符號的多個定義后,有必要有個方法可以指定個缺省的版本,對于這個符號的外部就可以找到這個版本。用這種方法,你可以只個符號的個版本作為缺省版本,否則,你會擁有同個符號的多個定義。如果你想要綁定個到共享庫中的符號的個指定的版本,你可以很方便地使用別名(比如oldoo),或者你可以使用'ymverVERSIONextern"lang" mands被支持的lang有‘C’,‘C++’和‘a(chǎn)va’。連接語言中的表達式的語法跟C的表達式是完全是致的。所有的表達式都以整型值被求值。所的表達式也被以相同的寬度求值。在32位系統(tǒng)是它是32位,否則是64位。就像在C中,連接器把以'0'開頭的整型數(shù)視為八進制數(shù),把以0x'或0X'把其它的整型數(shù)視為十進制。常數(shù)表示同個值。ourk1=K;ourk2=4096;ourk3=0x1000;除了,符號名都是以個字母,下劃線或者句號開始,可以包含字母,數(shù)字,下劃線,句點和連接號。不是被的符號名必須不和任何關鍵字。你可以指定個含有不固定它符數(shù)或具有跟關鍵字相同名字但SN=ithaspace"="alsoitaspace"+因為符號可以含有很多非文字字符,所以以空格分隔符號是很安全的。比如,AB是個符號,而'A-是個執(zhí)行減法運算的表達式。個特殊的連接器變量dt".'總是含有當前的輸出定位計數(shù)器。因為'.'總輸出段中的個位置,它只可以出現(xiàn)在'ECTON'命令中的表達式中。'.'符號可以出現(xiàn)在表達式中把個值賦給'.'{output{.=.+.+=}= }面的例子中,來'l的'et節(jié)被定位在輸出節(jié)output的起始位置。它后面跟有1000byte的空隙。然后是來'i2的'ext'節(jié),同樣是后面跟有1000byte的空隙,最后是來'i3'的'.ext' 注意:'.'實際上的是當前包含目標的從開始處的字節(jié)偏移。通常,它就是'SECTONS'語,其起地址是0,因為'.'可以被用作絕對地址。但是如果.'被用在節(jié)描述中,它的是從這個節(jié)起始處開始的偏移,而不是個絕對地址。這樣,在下面這樣個中:{.=.text:.=}.=.data:.+=}}度還是0x200bytes。(如果數(shù)據(jù)太多,那會產(chǎn)生條錯誤信息,因為這會試圖把'.'向前移)。aa'連接器可以識別標準的C的算術運算符集,以及它們的優(yōu)先集.1le!-2le*/3le+4le>>5le==!=><<=6le&7le8le9le?)&=+=-=*=12*e.求連接器是懶惰求表達式的值。它只在確實需要的時候去 連接器需要些信息,比如第個節(jié)的起始地址的值,還有內存區(qū)域的起點與長度,在做任何連接的時候但是,其它的值(比如符號的值)直到內存被分配之后才會知道或需要。這樣的值直到其它信息(比如輸出節(jié)的長度)可以被用來進行符號賦值的時候才被計算出來。有些表達式,比如那些依賴于定位計數(shù)器''的表達式,必須在節(jié)分配的過程中被計算出來。如果個表達式的結果現(xiàn)在被需要,但是目前得不到這個值,這樣會導致個錯誤。比如,象下面這樣個:{.text9+thisisntconstant{*(.text)}會產(chǎn)生個錯誤信息'nonconstantexpressionorinitial當個連接器計算個表達式時,得到的結果可能是個絕對值,也可能跟某個節(jié)相關。個節(jié)相關的表達式是從個節(jié)的址開始的固定的偏稱值。表達式在連接中的位置決定了它是或節(jié)相關的。個出現(xiàn)在輸出節(jié)定義中的表達式是跟輸出節(jié)的址相關的。個出現(xiàn)在其它地方的表達式則是。如果你通過'-r'選項指定需要可重位輸出,那思是下步的連接操作會改變這個符號的值。符號的節(jié)就是節(jié)相關的表達式所在的節(jié)。個被賦為絕對表達式的符號在后面進步的連接操作中會始終保持它的值不變。符號會是,并不如果個表達式有可能會是節(jié)相關的,你可以使用內建函數(shù)ABOLUTE強制個表達式為。比如,要創(chuàng)建個被賦為輸出節(jié)'.daa的末尾地址的絕對符號:{.data:{*(.data)edata=ABOLUTE();}如果沒有使用ALE,'eaa會跟節(jié)'.dta相關。為了使用連接表達式,連接語言含有
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025中國聯(lián)通江西分公司春季校園招聘152人高頻重點提升(共500題)附帶答案詳解
- 2025中國移動通信集團設計院限公司春季校園招聘高頻重點提升(共500題)附帶答案詳解
- 2025中國石油集團石油管工程技術研究院高校畢業(yè)生招聘14人高頻重點提升(共500題)附帶答案詳解
- 2025中國建筑土木建設限公司招聘443人高頻重點提升(共500題)附帶答案詳解
- 2025中交集團暨中國交建總部員工招聘1人高頻重點提升(共500題)附帶答案詳解
- 2025下半年重慶榮昌區(qū)事業(yè)單位歷年高頻重點提升(共500題)附帶答案詳解
- 2025下半年浙江舟山市屬事業(yè)單位招聘34人歷年高頻重點提升(共500題)附帶答案詳解
- 2025下半年中國南水北調集團東線限公司招聘3人高頻重點提升(共500題)附帶答案詳解
- 2025上海電子信息職業(yè)技術學院事業(yè)單位招聘12人高頻重點提升(共500題)附帶答案詳解
- 2025上海市規(guī)劃和國土資源管理局所屬事業(yè)單位招聘20人歷年高頻重點提升(共500題)附帶答案詳解
- 西藏林芝市第二高級中學新高考語文三模試卷及答案解析
- 景觀設計基礎智慧樹知到期末考試答案章節(jié)答案2024年湖南應用技術學院
- (高清版)JTG 5142-2019 公路瀝青路面養(yǎng)護技術規(guī)范
- JT-T 1496-2024 公路隧道施工門禁系統(tǒng)技術要求
- 2024年輔警招聘考試試題庫及完整答案(全優(yōu))
- 公務員歷史常識100題附答案(滿分必刷)
- 醫(yī)務科工作制度及流程(全套)
- 西方經(jīng)濟學的奇妙世界智慧樹知到期末考試答案2024年
- 屋頂光伏施工安全知識講座
- 新型冠狀肺炎科普知識講座總結
- 銀行員工消保培訓課件
評論
0/150
提交評論