私は x86 アセンブラーの経験があまりなく、 mach_inject のバグに関連する問題をデバッグしようとしています。
元のコードは次のようになります ( mach_inject
mach_inject.c の関数):
#if defined(__x86_64__)
imageOffset = 0; // RIP-relative addressing
#else
ASSERT_CAST( void*, remoteCode );
imageOffset = ((void*) remoteCode) - image;
#endif
それから少し後で ( INJECT_ENTRY
mach_inject_bundle_stub.c の機能):
pthread_create( &thread,
&attr,
(void* (*)(void*))((long)some_local_function + imageOffset),
(void*) param );
私にとっては、これを x86 用にコンパイルすると失敗するようです。すべてのアーキテクチャ (つまり、x86 用) だけにコードを変更するとimageOffset = 0;
、すべて正常に動作します。
それで、いくつかの質問:
- RIP 相対アドレッシングは 32bit/x86 モードでも使用できますか?
- とにかく32ビットモードのRIP相対アドレッシングもある場合、このコードの(おそらく)最初の意図は何でしたか?
- RIP 相対アドレス指定はコンパイラの設定ですか? または、コードで RIP 相対アドレス指定を使用するかどうかをどのように制御できますか? (または、このバグにもっと関連しています:
imageOffset = 0;
常に正しいですか? または、正しくないのはいつですか?)