2014-01-06 88 views
1

我想创建一个使用dlsym和dlopen的通用工具,用于加载外部库并从中调用特定的函数。我现在该工具的代码是:如何使用dlsym()调用函数,其中我知道参数的数量,但不知道函数的类型,也不知道函数的返回类型?

void bootload(string libraryname, string functionname, int argc, char** argv) { 
    void *handle; 
    char *error; 

    handle = dlopen(libraryname.c_str(), RTLD_LAZY); 

    if (!handle) { 
     fprintf(stderr, "%s\n", dlerror()); 
     exit(EXIT_FAILURE); 
    } else { 
     cout << "\nSuccessfuly opened " << libraryname << endl; 
    } 

    dlerror(); 

    typedef void (*bootload_t)(); 
    bootload_t bl_function = (bootload_t) dlsym(handle, functionname.c_str()); 

    if ((error = dlerror()) != NULL) { 
     fprintf(stderr, "%s\n", error); 
     exit(EXIT_FAILURE); 
    } 

    bl_function(); 
    dlclose(handle); 
} 

现在argc和argv将分别包含函数functionname的参数的数量和情况。

如何通过传递正确的参数并返回正确的类型来正确调用functionname?

一些帮助将不胜感激。

+0

我能想到的唯一方法是解析调试信息(例如使用'libdwarf')来找出函数声明。但它如何帮助你?为所有可能的参数组合写一个大的'if' /'else'?或者在调用函数之前手动准备堆栈? – qrdl

+1

你不能。你需要知道类型。 –

+0

它看起来像你想使用[libffi](http://sourceware.org/libffi/)。当然,你仍然需要知道(在运行时)参数的类型。 – rodrigo

回答

1

如何使用dlsym()调用函数,其中我知道参数的数量,但不知道类型,也没有函数的返回类型?

你不知道。这是不可能传递参数功能期望,如果你不知道他们的类型。

相关问题