連接腳本的學(xué)習(xí)_第1頁
連接腳本的學(xué)習(xí)_第2頁
連接腳本的學(xué)習(xí)_第3頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、連接腳本的學(xué)習(xí)概論每一個(gè)鏈接過程都由鏈接腳本(linker script, 一般以Ids作為文件的后綴名)控制.鏈接腳本主 要用于規(guī)定如何把輸入文件內(nèi)的section放入輸出文件內(nèi),并控制輸出文件內(nèi)各部分在程序 地址空間內(nèi)的布局.但你也可以用連接命令做一些其他事情.連接器有個(gè)默認(rèn)的內(nèi)置連接腳本,可用ld -verbose查看.連接選項(xiàng)-r和-N可以影響默認(rèn)的連 接腳本(如何影響?).-T選項(xiàng)用以指定自己的鏈接腳本,它將代替默認(rèn)的連接腳本。你也可以使用暗含的連接腳 本以增加自定義的鏈接命令.以下沒有特殊說明,連接器指的是靜態(tài)連接器.基本概念鏈接器把一個(gè)或多個(gè)輸入文件合成一個(gè)輸出文件.輸入文件:目

2、標(biāo)文件或鏈接腳本文件.輸出文件:目標(biāo)文件或可執(zhí)行文件.目標(biāo)文件(包括可執(zhí)行文件)具有固定的格式,在UNIX或GNU/Linux平臺(tái)下,一般為ELF格 式.若想了解更多,可參考UNIX/Linux平臺(tái)可執(zhí)行文件格式分析有時(shí)把輸入文件內(nèi)的section稱為輸入section(input section),把輸出文件內(nèi)的section稱為輸 出 section(output sectin).目標(biāo)文件的每個(gè)section至少包含兩個(gè)信息:名字和大小.大部分section還包含與它相關(guān)聯(lián) 的一塊數(shù)據(jù),稱為section contents(section內(nèi)容).一個(gè)section可被標(biāo)記為“l(fā)oadabl

3、e(可加載 的)”或“allocatable(可分配的)”.loadable section:在輸出文件運(yùn)行時(shí),相應(yīng)的section內(nèi)容將被載入進(jìn)程地址空間中.allocatable section:內(nèi)容為空的section可被標(biāo)記為“可分配的”.在輸出文件運(yùn)行時(shí),在進(jìn)程 地址空間中空出大小同section指定大小的部分.某些情況下,這塊內(nèi)存必須被置零.如果一個(gè)section不是“可加載的”或“可分配的”,那么該section通常包含了調(diào)試信息.可 用objdump -h命令查看相關(guān)信息.每 個(gè)“可加載的”或“可分配的”輸出section通常包含兩個(gè)地址:VMA(virtual memory

4、address 虛擬內(nèi)存地址或程序地址空間地址)和LMA(load memory address加載內(nèi)存地址或進(jìn)程地址 空間地址).通常VMA和LMA是相同的.在目標(biāo)文件中,loadable或allocatable的輸出section有兩種地址:VMA(virtual MemoryAddress)和LMA(Load Memory Address). VMA是執(zhí)行輸出文件時(shí)section所在的地址,而 LMA是加載輸出文件時(shí)section所在的地址.一般而言,某section的VMA = LMA.但在嵌 入式系統(tǒng)中,經(jīng)常存在加載地址和執(zhí)行地址不同的情況:比如將輸出文件加載到開發(fā)板的 flash中

5、(由LMA指定),而在運(yùn)行時(shí)將位于flash中的輸出文件復(fù)制到SDRAM中(由VMA指 定).可這樣來理解VMA和LMA,假設(shè):(1).data section對(duì)應(yīng)的VMA地址是0 x08050000,該section內(nèi)包含了 3個(gè)32位全局變量,i、 j和k,分別為1,2,3.(2).text section內(nèi)包含由printf( j=%d ”, j );”程序片段產(chǎn)生的代碼.連接時(shí)指定.data section的VMA為0 x08050000,產(chǎn)生的printf指令是將地址為0 x08050004 處的4字節(jié)內(nèi)容作為一個(gè)整數(shù)打印出來。如果.data section 的 LMA 為 0 x0

6、8050000,顯然結(jié)果是 j=2 如果.data section 的 LMA 為 0 x08050004,顯然結(jié)果是 j=1還可這樣理解LMA:.text section內(nèi)容的開始處包含如下兩條指令(intel i386指令是10字節(jié),每行對(duì)應(yīng)5字節(jié)):jmp 0 x08048285movl $0 x1,%eax如果.text section的LMA為0 x08048280,那么在進(jìn)程地址空間內(nèi)0 x08048280處為“jmp 0 x08048285 ”指令,0 x08048285處為 movl $0 x1,%eax指令.假設(shè)某指令跳轉(zhuǎn)到地址 0 x08048280,顯然它的執(zhí)行將導(dǎo)致%e

7、ax寄存器被賦值為1.如果.text section的LMA為0 x08048285,那么在進(jìn)程地址空間內(nèi)0 x08048285處為“jmp 0 x08048285 ”指令,0 x0804828a處為 movl $0 x1,%eax指令.假設(shè)某指令跳轉(zhuǎn)到地址 0 x08048285,顯然它的執(zhí)行又跳轉(zhuǎn)到進(jìn)程地址空間內(nèi)0 x08048285處,造成死循環(huán).符號(hào)(symbol):每個(gè)目標(biāo)文件都有符號(hào)表(SYMBOL TABLE),包含已定義的符號(hào)(對(duì)應(yīng)全局 變量和static變量和定義的函數(shù)的名字)和未定義符號(hào)(未定義的函數(shù)的名字和引用但沒定義 的符號(hào))信息.符號(hào)值:每個(gè)符號(hào)對(duì)應(yīng)一個(gè)地址,即符號(hào)值

8、(這與c程序內(nèi)變量的值不一樣,某種情況下可以 把它看成變量的地址).可用nm命令查看它們.(nm的使用方法可參考本blog的GNU binutils 筆記)腳本格式鏈接腳本由一系列命令組成,每個(gè)命令由一個(gè)關(guān)鍵字(一般在其后緊跟相關(guān)參數(shù))或一條對(duì)符 號(hào)的賦值語句組成.命令由分號(hào);分隔開.文件名或格式名內(nèi)如果包含分號(hào);或其他分隔符,則要用引號(hào)”將名字全稱引用起來.無 法處理含引號(hào)的文件名./* */之間的是注釋。簡(jiǎn)單例子在介紹鏈接描述文件的命令之前,先看看下述的簡(jiǎn)單例子:以下腳本將輸出文件的text section定位在0 x10000, data section定位在0 x8000000:SEC

9、TIONS.=0 x10000;.text : *(.text) .=0 x8000000;.data : *(.data) .bss : *(.bss) 解釋一下上述的例子:.=0 x10000 :把定位器符號(hào)置為0 x10000 (若不指定,則該符號(hào)的初始值為0).text : *(.text) :將所有(*符號(hào)代表任意輸入文件)輸入文件的.text section合并成一個(gè).text section,該section的地址由定位器符號(hào)的值指定,即0 x10000.=0 x8000000 :把定位器符號(hào)置為0 x8000000.data : *(.data) :將所有輸入文件的.data section 合并成一個(gè).data section,該 section 的地址 被置為 0 x8000000.bss : *(.bs

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論