x86およびamd64用のトランポリンを作成して、特定の関数呼び出しが既知のメモリ位置に格納されているアドレスにすぐにベクトル化されるようにしようとしています(目的は、最初のターゲットアドレスが特定のDLL(Windows)内にあることを確認することです)。
次のコードは_fn
、実際のターゲット アドレスを開始するメモリ ロケーション (またはそれらのグループ) として使用しようとしています。
(*_fn[IDX])(); // rough equivalent in C
.globl _asmfn
_asmfn:
jmp *_fn+8*IDX(%rip)
はIDX
、いくつかの CPP マクロを使用して構築され、それぞれ_fn
が関数ポインターの配列内のスロットに一意にマップされるさまざまな埋め込み DLL ベクトルを提供することを目的としています。これは単純なテスト プログラムで動作しますが、実際に共有ライブラリに配置すると (現時点では OSX でテストします)、_asmfn コードにベクトルしようとするとバス エラーが発生します。
Invalid memory access of location 0x10aa1f320 rip=0x10aa1f320
このコードの最終的なターゲットは Windows ですが、まだ試したことはありません (最初に OSX/intel のテスト ケースで少なくともアセンブリを証明できると考えました)。amd64 ジャンプは、少なくとも名目上は正しいですか、それとも何かを見逃していますか?
amd64 のトランポリンに関する参考資料です。
編集
ジャンプはWindows 7で適切に機能します(最終的にテストする機会を得ました)。ただし、OSXで失敗する理由を知りたいと思っています。バス エラーは KERN_PROTECTION_FAILURE によって引き起こされます。これは、OS の保護がそのコードの実行を妨げていることを示しているように見えます。ターゲット アドレスは割り当てられたメモリ (libffi によって生成されたトランポリンです) ですが、実行可能メモリとして適切にマークされていると思います。それが実行可能メモリの問題である場合、それは私のスタンドアロン テスト コードが機能する理由を説明します (コールバック トランポリンはコンパイルされ、割り当てられません)。