2012-02-22 34 views
1

我创建了共享库(将用作插件)。还有像一个使用内联汇编器从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

回答

1

看libffi:“一个便携式外部函数接口库”

“的libffi库提供了一个可移植的,高层次的编程接口,以各种调用约定这允许程序员在运行时调用由调用接口描述指定的任何函数。“

http://sourceware.org/libffi/

1

你不必汇编程序调用的功能,实际上是:

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在线,在您生成呼叫代码编译时间。您无法将string变量传递给asm,因为在程序编译期间应该生成内联代码asm。这意味着你不能做

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

将从脚本调用函数并将参数存储在数组中。所以编译时间“调用”不是解决方案。 – zdenek 2012-02-22 20:04:41

+0

@ user1173308,请参阅我的编辑 – Lol4t0 2012-02-22 20:10:57

+0

不,不,用ASM内联,代码将在运行时生成。例如(伪代码):** foreach(params){push parm; } call func; ** – zdenek 2012-02-22 20:26:04