共有ライブラリ(プラグインのように使用されます)を作成しました。私はなく、コンパイル時では、C++(GCC、Linux)の中で、このライブラリから関数を呼び出すしたいと思いますインラインアセンブラを使用したGCCの共有ライブラリからの呼び出し関数
extern "C" long __attribute__ ((__cdecl__)) SumAgrs(long X, long Y, long Z, long *Out)
{
*Out = X + Y + Z;
return 0;
}
のような機能がたくさんあります。インラインアセンブラを使用すると、 "push"命令はローカル変数を破壊し、どのように修正するかわかりません。
typedef int (*FARPROC)();
void *dl_handle = dlopen("plugin.so", RTLD_LAZY);
FARPROC proc = (FARPROC)dlsym(dl_handle, "SumAgrs");
long result;
asm("leal %0, %%eax\n\r" \
"pushl %%eax" : : "m" (result));
asm("pushl $10");
asm("pushl $15");
asm("pushl $20");
asm("call *%0" : : "m" (proc));
結果のバイナリファイルは、コール* 24(%のESP)のようなものが含まれています。だから私のpushl変更%espとコールセグメンテーション違反が原因です。しかし、この行動を避けるには?
extern "C"
{
typedef long __attribute__ ((__cdecl__)) (*Proc)(long X, long Y, long Z, long *Out);
}
void *dl_handle = dlopen("plugin.so", RTLD_LAZY);
Proc proc = (Proc)dlsym(dl_handle, "SumAgrs");
proc(...); // call
注意を、どちらかあなたはCコードで関数を呼び出す、またはASMをインラインで生成されたコールのためにあなたのコードを持つこと:あなたが実際に、関数を呼び出すようアセンブラ必要はありません
THX
関数はスクリプトから呼び出され、パラメータは配列に格納されます。だから、コンパイル時の "呼び出し"は解決策ではありません。 – zdenek
@ user1173308、私の編集 – Lol4t0
を参照してください。いいえ、ASMインラインで、コードは実行時に生成されます。例えば(擬似コード):** foreach(params){push parm; } call func; ** – zdenek