導航:首頁 > 源碼編譯 > 編譯重定位

編譯重定位

發布時間:2022-10-02 22:15:32

① Linux c 符號的重定位信息

編譯器生成一個目標文件後,其並不知道代碼和變數最終的存儲位置,也不知道定義在其他文件中的外部符號。因此編譯器會生成一個重定位表目,裡面存儲著關於每一個符號的信息。這個表目告知鏈接器在合並目標文件時應該如何修改每個目標文件中對符號的引用。這種重定位表目存儲在.rel.text 段中和.rel.data 段中。該表目可以理解為一個結構體,其中存儲著每一個符號的重定位信息。
offset表示該符號在存儲的段中的偏移值。symbol 代表該符號的名稱,字元串實際存儲在.strtab 段中,這里存儲的是該字元串首地址的下標。type表示重定位類型,鏈接器只關心兩種類型,一種是與PC相關的重定位引用,另一種是絕對地址引用。
PC相關的重定位引用表示將當前的PC值(這個值通常是下一條指令的存儲位置)加上該符號的偏移值。絕對地址引用表示將當前指令中已經指定的地址引用直接作為跳轉的地址,不需要進行任何修改。
有了這些信息,鏈接器就可以將符號在存儲段中的偏移值加上該段在重定位後該段的新地址,這樣就得到了一個新的引用地址,而這個引用地址就是該符號的最終地址。同樣,在程序所有引用該地址的部分都要作修改,使用這個新的絕對地址代替舊的偏移地址。當新的符號地址被修改完畢之後,鏈接器的工作就結束了。

② 編譯完成之後得到的.o文件,為什麼叫可重定位目標文件

c語言編譯.c和.cpp文件為.o文件,是將所有的.c和.cpp文件都生成.o文件。再把所有的.o文件鏈接成為可執行程序。而每一個.o目標文件對應不同的源文件,所以叫可重定位目標文件。

③ 什麼是重定位重定位有哪幾種類型2為什麼要進行重定位

1.什麼是重定位?由於一個作業裝入到與其地址空間不一致的存儲空間,對有關地址部分的調整過程稱為重定位。2.重定位有哪幾種類型?分為靜態重定位和動態重定位兩種類型。3.為什麼要進行重定位?我們寫正常程序的時候根本不用去關心變數(常量)的位置,因為源程序在編譯的時候它的內存中的位置郡被計算好了。程序裝入內存時,系統不會為它重定位。我們需要用到變數 (常量)的時候直接用變數名訪問它就行了。有的程序不可避免也要用到變數 (常量),各個變數 (常量)在內存中的位置自然也不相同。既然這些變數沒有固定的地址,那麼程序在運行的過程中只有重定位,才可以正常地訪問相關資源。

④ C符號的重定位信息

當編譯器生成一個目標文件後,其並不知道代碼和變數最終的存儲位置,也不知道定義在其他文件中的外部符號。因此編譯器會生成一個重定位表目,裡面存儲著關於每一個符號的信息。這個表目告知鏈接器在合並目標文件時應該如何修改每個目標文件中對符號的引用。這種重定位表目存儲在.rel.text 段中和.rel.data 段中。該表目可以理解為一個結構體,其中存儲著每一個符號的重定位信息。
offset表示該符號在存儲的段中的偏移值。symbol 代表該符號的名稱,字元串實際存儲在.strtab 段中,這里存儲的是該字元串首地址的下標。type表示重定位類型,鏈接器只關心兩種類型,一種是與PC相關的重定位引用,另一種是絕對地址引用。PC相關的重定位引用表示將當前的PC值(這個值通常是下一條指令的存儲位置)加上該符號的偏移值。絕對地址引用表示將當前指令中已經指定的地址引用直接作為跳轉的地址,不需要進行任何修改。有了這些信息,鏈接器就可以將符號在存儲段中的偏移值加上該段在重定位後該段的新地址,這樣就得到了一個新的引用地址,而這個引用地址就是該符號的最終地址。同樣,在程序所有引用該地址的部分都要作修改,使用這個新的絕對地址代替舊的偏移地址。當新的符號地址被修改完畢之後,鏈接器的工作就結束了。

⑤ 重定位的時機

將邏輯地址空間重定位到物理地址空間的時機有三種:

1、程序編譯連接時。

2、程序裝入內存時。

3、程序執行時。

重定位就是把程序的邏輯地址空間變換成內存中的實際物理地址空間的過程。它是實現多道程序在內存中同時運行的基礎。重定位有兩種,分別是動態重定位與靜態重定位。

分類

對程序進行重定位的技術按重定位的時機可分為兩種:靜態重定位和動態重定位。

靜態重定位:是在目標程序裝入內存時,由裝入程序對目標程序中的指令和數據的地址進行修改,即把程序的邏輯地址都改成實際的地址。對每個程序來說,這種地址變換只是在裝入時一次完成,在程序運行期間不再進行重定位。

動態重定位:是在程序執行期間每次訪問內存之前進行重定位。這種變換是靠硬體地址變換機構實現的。通常採用一個重定位寄存器,其中放有當前正在執行的程序在內存空間中的起始地址,而地址空間中的代碼在裝入過程中不發生變化。

⑥ 重定位是什麼意思

一、定義:重定位就是把程序的邏輯地址空間變換成內存中的實際物理地址空間的過程,也就是說在裝入時對目標程序中指令和數據的修改過程.他是實現多道程序在內存中同時運行的基礎.重定位有兩種,分別是動態重定位與靜態重定位
二、分類
1、靜態重定位:即在程序裝入內存的過程中完成,是指在程序開始運行前,程序中的各個地址有關的項均已完成重定位,地址變換通常是在裝入時一次完成的,以後不再改變,故成為靜態重定位.
2、動態重定位:它不是在程序裝入內存時完成的,而是CPU每次訪問內存時 由動態地址變換機構(硬體)自動進行把相對地址轉換為絕對地址.動態重定位需要軟體和硬體相互配合完成.
三、時機
將邏輯地址空間重定位到物理地址空間的時機有三種:
1、程序編譯連接時.
2、程序裝入內存時.
3、程序執行時.
四、擴展閱讀:
重定位是由操作系統安排的.
在裝入程序前,系統會計算未使用的內存,然後將程序裝入,並記下開始地址.在執行有相對地址的指令時,會將所有的地址加個剛才記下的開始地址,就叫重定位.
重定位與EXE文件無關,它是程序裝入時的一種方式.利用重定位可提高內存空間的使用率.

⑦ 菜鳥求助:匯編代碼的重定位

個人建議,不妨一試:
把"Local szCaption[5]: byte
Local szText[6]: byte "
這兩個變數,改為全局變數!
補充:
那就這樣吧,再試一次
.code

@test proc
Local szCaption[5]: byte
Local szText[6]: byte
pushad
call @F
@@:
pop ebx
sub ebx, offset @B
lea esi,szCaption
lea edi,szText
mov byte ptr[ebx+esi], 't'
mov byte ptr[ebx+esi+1], 'e'
mov byte ptr[ebx+esi+2], 's'
mov byte ptr[ebx+esi+3], 't'
mov byte ptr[ebx+esi+4], 0
mov byte ptr[ebx+edi], 'H'
mov byte ptr[ebx+edi+1], 'e'
mov byte ptr[ebx+edi+2], 'l'
mov byte ptr[ebx+edi+3], 'l'
mov byte ptr[ebx+edi+4], 'o'
mov byte ptr[ebx+edi+5], 0
invoke MessageBox, NULL, addr [ebx+szCaption], addr [ebx+szText], MB_OK
invoke ExitProcess, 0
popad
ret
@test endp

Start:
call @test
end Start

⑧ vc++6.0如何才能編譯出可重定位的exe文件

相信自己 我能行 是真的

閱讀全文

與編譯重定位相關的資料

熱點內容
喜購app怎麼樣 瀏覽:804
交換機查鄰居命令 瀏覽:343
渲染卡在正在編譯場景幾何體 瀏覽:315
app進入頁面為什麼有編譯 瀏覽:563
真我手機照片加密怎麼找回 瀏覽:637
怎麼查自己的app專屬流量 瀏覽:105
安卓車機一般是什麼主機 瀏覽:740
wps電腦版解壓包 瀏覽:79
怎麼在手機設置中解除應用加密 瀏覽:551
安卓手機怎麼讓微信提示音音量大 瀏覽:331
批處理域用戶訪問共享文件夾 瀏覽:132
怎麼做軟綿綿解壓筆 瀏覽:699
壓縮包網路傳輸會丟色嗎 瀏覽:221
x79伺服器主板用什麼內存條 瀏覽:441
小程序編譯器源碼 瀏覽:66
程序員降薪么 瀏覽:201
u盤內部分文件夾不顯示 瀏覽:397
手機上pdf怎麼加密碼 瀏覽:1001
51單片機hex文件 瀏覽:329
vsc怎麼編譯bin 瀏覽:6