2017-09-04 216 views
-2

彙編器生成的可重定位機器代碼的用途是什麼?如果生成,那麼獲取可重定位機器代碼將其轉換爲絕對代碼的用法是什麼?彙編器生成的可重定位機器代碼的用途是什麼?以及之後爲什麼將其轉化爲絕對值?

我看了這部影片。 https://www.youtube.com/watch?v=Qkwj65l_96I&t=309s

在他提及的絕對和相對機器碼

+1

因此,可以將多個可重定位的機器代碼對象文件合併爲一個可執行映像,並可選擇使可執行映像可以重新定位並加載不同的地址。 –

+0

@KarshSoni你明白什麼是可重定位代碼?大部分是相對地址與固定地址。如果不是全部程序都使用編譯器,彙編器和鏈接器可以爲您完成工作的相對編址,則可以使大多數程序都可以使用。重要的是你可以在其他地方重新定位二進制文​​件。因此,例如,不是從地址0x1000處的指令讀取絕對地址0x1234,而是讀取當前地址(PC相對尋址)之前的0x234字節位置。 –

+0

https://stackoverflow.com/questions/45945018/does-arm-none-eabi-ld-rewrite-the-bl-instruction/45951427#45951427是一個使用相對尋址的例子,在這種情況下插入一個固定的地址表必須將其作爲重定位的一部分進行修改。可以編寫簡單的示例,不需要任何運行時修補... –

回答

2

所以重定位代碼使用相對地址?

不,至少不一定。

或者你的意思是「位置無關的代碼」而不是「可重新定位的代碼」?

彙編程序生成的可重定位機器代碼的用法是什麼?

理論上你可以一次裝配整個程序。 (事實上​​,我已經這樣做時,我寫了一個彙編程序的一個歷史性的CPU。)

但是這有一個主要缺點:

下面的代碼行的想:

mov [myVariable], eax 

比方說,變量myVariable位於地址0x1234560。然後在機器代碼,就必須有下列指示:

mov [0x1234560], eax 

現在你修改一個文件在您的項目,該項目由〜200個文件(這是典型的在汽車行業的項目)。假設您在項目開始時向某個文件添加了一些說明。

這意味着在項目中跟隨該文件的所有元素(文件)的地址將會改變。假設myVariable的地址現在不再是0x1234560,而是0x1234870

這意味着我們的代碼行現在必須爲以下指令:

mov [0x1234870], eax 

因爲這個項目中的所有文件必須重新組裝的!

如果你有重定位代碼生成以下指令:

mov [0], eax 

...和一些信息,地址0必須的myVariable地址來代替。

這意味着只有200個文件中的一個發生更改時,必須更換地址。

相關問題