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アドレスを取得する別の方法があります。例えば、そのアドレスを指定するシンボルがあるか、それを返す関数がありますか?
EBXを復元する必要はありません。 PICコンパイルされた関数は、それを設定する関数の始めに何かを持っているはずです。 (例えば '__x86.get_pc_thunk.bx'の呼び出し)。 –
あなたは正しい牛です。それぞれのPICオブジェクトには独自のシンボルテーブルが付いてくるので、意味があると思います。あなたがあなたの答えを加えたら私はそれを受け入れます。 –