質問自体については、バイナリをロードしたメモリにアドレスを追加するだけです。つまり、アドレスにバイナリをロードした場合は、myLoadAddress
それをに追加するだけmyOffset
です。ただし、これでは関数を簡単に呼び出すことはできません。これを行う場合は、ライブラリファイルのように扱う必要があります(実際にライブラリファイルである場合は、WindowsでLoadLibraryなどのライブラリをロードするためのシステム関数をチェックし、 GetProcAddressを使用して関数へのポインタを取得します)。
// create a type for your function signature
typedef void (*myFunc)(A *arg1, B arg2, C arg3);
// create a pointer to your function
myFunc myFuncPointer;
// set the address of the function in memory
myFuncPointer = myLoadAddress + myOffset;
// invoke function
myFuncPointer(A, B, C);
DLLをロードするときは、LoadLibraryを使用してロードし、次にGetProcAddressを使用して、関数ポインターに返されたアドレスを型キャストしますmyFuncPointer = (myFunc)GetProcAddress(hmodule, "myFunc");
(例では)。
POSIXでもほとんど同じように機能しますが、関数は少し異なりますdlopen
。ダイナミックライブラリのロードとdlsym
シンボルの取得に使用します。プログラミングライブラリのハウツーでは、これについて詳しく説明しています。または、dlopenとdlsymのマニュアルページを参照してください。基本は同じです。