我创建了共享库(将用作插件)。还有像一个使用内联汇编器从GCC的共享库调用函数
extern "C" long __attribute__ ((__cdecl__)) SumAgrs(long X, long Y, long Z, long *Out)
{
*Out = X + Y + Z;
return 0;
}
很多功能我想打电话从这个库函数在C++(GCC和Linux),而不是在编译的时候。当我使用内联汇编程序时,“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更改%尤其和调用导致分段错误。但是如何避免这种行为?
THX
将从脚本调用函数并将参数存储在数组中。所以编译时间“调用”不是解决方案。 – zdenek 2012-02-22 20:04:41
@ user1173308,请参阅我的编辑 – Lol4t0 2012-02-22 20:10:57
不,不,用ASM内联,代码将在运行时生成。例如(伪代码):** foreach(params){push parm; } call func; ** – zdenek 2012-02-22 20:26:04