簡體   English   中英

與位置無關的代碼和vtable

[英]Position-independent code and vtable

虛擬函數如何在與位置無關的代碼中實現?

我知道如果我的類有虛函數,編譯器通常會為它生成一個包含所有虛函數地址的vtable,並在我的類的每個對象中存儲一個指向vtable的指針。

現在,如果我的代碼與位置無關,則編譯器無法知道虛函數的地址(或任何函數)。 那它是做什么的?

我想知道真正的編譯器是做什么的(不是理論上可行的); 我最感興趣的是Linux 32位平台,但其他平台也有點有趣。

有兩種選擇:

  1. 接受你的vtable不會與位置無關,並嘗試將其從代碼部分移開,以便所有需要動態鏈接fixup的代碼彼此相鄰,以減少不可共享頁面的數量。 gcc這樣做
  2. 在vtable中使用相對跳躍。 我不知道有任何實現這樣做,並且它只有在vtable與方法實現固定偏移時才有效,並且這些在加載時不能被覆蓋(它們可以在典型的ELF系統上)。

我建議您編寫一些示例程序並使用例如IDA Pro自行檢查。 下載免費版演示版

基本上,vtable無處不在實現為函數指針表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM