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?
一些帮助将不胜感激。
我能想到的唯一方法是解析调试信息(例如使用'libdwarf')来找出函数声明。但它如何帮助你?为所有可能的参数组合写一个大的'if' /'else'?或者在调用函数之前手动准备堆栈? – qrdl
你不能。你需要知道类型。 –
它看起来像你想使用[libffi](http://sourceware.org/libffi/)。当然,你仍然需要知道(在运行时)参数的类型。 – rodrigo