2012-02-22 18 views
1

共有ライブラリ(プラグインのように使用されます)を作成しました。私はなく、コンパイル時では、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

答えて

1

ルック意味します実行時にコールインタフェース記述で指定された関数を呼び出すことができます。

http://sourceware.org/libffi/

1

コンパイル時間。プログラムのコンパイル中にasmのインラインコードを生成する必要があるため、変数をasmに渡すことはできません。 。「ポータブル外部関数インタフェースライブラリ」

「libffiライブラリは、さまざまな呼び出し規約に移植、高レベルのプログラミング・インタフェースを提供します。これは、プログラマーを許可する:それはあなたが行うことはできませんlibffiで

std::string asm_code; 
std:: cin >> asm_code; 
asm(asm_code); 
+0

関数はスクリプトから呼び出され、パラメータは配列に格納されます。だから、コンパイル時の "呼び出し"は解決策ではありません。 – zdenek

+0

@ user1173308、私の編集 – Lol4t0

+0

を参照してください。いいえ、ASMインラインで、コードは実行時に生成されます。例えば(擬似コード):** foreach(params){push parm; } call func; ** – zdenek

関連する問題