- 論壇徽章:
- 3
|
本帖最后由 captivated 于 2012-09-17 21:32 編輯
回復(fù) 9# mr_sev
嗯. 回答沒錯, 不過你還是沒有注意到我的解釋. 這證明你看得不夠仔細(xì)(小小得意一下, 哈哈).
地址無關(guān)代碼技術(shù)是編譯期由編譯器實施的技術(shù), .got不過是個類似于.data的數(shù)據(jù)段, 而且它里面的item是在加載期由動態(tài)鏈接器填寫的. Lazy Binding先不討論, 總體上是這樣的.
關(guān)鍵的地方在于, 地址無關(guān)代碼的實現(xiàn)本身要求訪問數(shù)據(jù)時對于指令的選擇 -- 簡單的說, 你要mov一個內(nèi)存數(shù)據(jù)到寄存器, 不是簡單的 movl var_addr, %ebx 這種指令的事情, 而是必須要獲得內(nèi)存數(shù)據(jù)對于eip亦即pc的相對偏移量, 這個才是PIC(Position Independent Code)的關(guān)鍵啊. 而選擇使用(或者把C語言代碼編譯為)哪個(或者哪一系列)匯編指令, 是編譯器的事情. 至于.got的填寫已經(jīng)和編譯器沒有關(guān)系了(前面已經(jīng)解釋過那是運行期行為了), 注意到這一點才能算是對地址無關(guān)代碼技術(shù)有透徹的理解了哦.
|
|