2016-06-15 2 views
1

JIT compiler for the virtual machine in ioquake3を維持しています。PIC/PIEバイナリ内のグローバルシンボルテーブル(GOT)のアドレス

最近、誰かがioquake3からPIEバイナリを作成しようとしましたが、コンパイルされたコードはPICコード内のEBXレジスタを大量に使用するため、PIEバイナリはGOTアドレスを含む固定レジスタです。

仮想マシンは固定小数点でGCCコンパイルコードを呼び出すことがあります。そこで、EBXをGOTアドレスに復元する必要があります。 JITコンパイラコードは、EBXをそのアドレスに復元するコードを出力できるように、GOTアドレスを知る必要があります。 は、私はあなたが直接そのようにインラインアセンブリを使用することができます想像:EBXは、JITコンパイル時およびVMへの呼び出しで同じである必要がありますので

void *gotptr; 

__asm__ volatile("\n": "=b" (gotptr)); 

コンパイルされたコードを直接JITコンパイラのコードから呼び出されます。私の質問は:これは動作し、CコードからGOTアドレスを取得する別の方法があります。例えば、そのアドレスを指定するシンボルがあるか、それを返す関数がありますか?

+0

EBXを復元する必要はありません。 PICコンパイルされた関数は、それを設定する関数の始めに何かを持っているはずです。 (例えば '__x86.get_pc_thunk.bx'の呼び出し)。 –

+0

あなたは正しい牛です。それぞれのPICオブジェクトには独自のシンボルテーブルが付いてくるので、意味があると思います。あなたがあなたの答えを加えたら私はそれを受け入れます。 –

答えて

3

System V i386 ABIでは、必要に応じてEBXを設定するために関数の責任が呼び出されるため、PIC/PIEコンパイルされた関数を呼び出すときにそれを復元する必要はありません。 ABIは、状態として:

位置独立コードは、グローバルオフセットテーブルのアドレス を保持するために%ebxレジスタを使用しています。関数がグローバルオフセット テーブルのアドレスを直接的または間接的に必要とする場合は、 の値を計算する必要があります。

関連する問題