7

仮想関数は位置に依存しないコードでどのように実装されますか?

クラスに仮想関数がある場合、コンパイラは通常、すべての仮想関数のアドレスを含むvtableを生成し、クラスの各オブジェクトにvtableへのポインタを格納することを知っています。

さて、私のコードが位置に依存しない場合、コンパイラーは仮想関数(または、さらに言えば、任意の関数)のアドレスを知ることができません。それで、それは何をしますか?

実際のコンパイラが何をするのか知りたいです(理論的に可能なことではありません)。私は主にLinux32ビットプラットフォームに興味がありますが、他のプラットフォームも少し興味深いものです。

4

3 に答える 3

9

2つのオプションがあります。

  1. vtableが位置に依存しないことを受け入れ、コードセクションから離して、共有できないページの数を減らすために動的リンクの修正が必要なすべてのコードが隣り合って存在するようにします。gccはこれを行います。
  2. vtableで相対ジャンプを使用します。私はこれを行う実装を知りません。vtableがメソッドの実装から一定のオフセットで動作し、ロード時にオーバーライドできない場合にのみ機能します(通常のELFシステムでオーバーライドできます)。
于 2011-03-21T12:29:20.920 に答える
-1

基本的に、vtableは関数ポインタのテーブルとしてどこにでも実装されています。

于 2011-03-21T12:26:23.600 に答える
-2

いくつかのサンプルプログラムを作成し、IDAProなどで自分で調べることをお勧めします。フリーウェアバージョンまたはデモバージョンをダウンロードします。

于 2011-03-21T12:25:49.920 に答える