0

私は x86 アセンブラーの経験があまりなく、 mach_inject のバグに関連する問題をデバッグしようとしています。

元のコードは次のようになります ( mach_injectmach_inject.c の関数):

#if defined(__x86_64__)
        imageOffset = 0; // RIP-relative addressing
#else
        ASSERT_CAST( void*, remoteCode );
        imageOffset = ((void*) remoteCode) - image;
#endif

それから少し後で ( INJECT_ENTRYmach_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;常に正しいですか? または、正しくないのはいつですか?)
4

0 に答える 0