嗨我动态加载函数并执行它们。我希望能够定义泛型返回类型,以便编译器可以正确清理堆栈。目前它的版本字符串打印乱码。
如何使以下代码生效?
// gcc -o test test.c -ldl
#include <stdio.h>
#include <dlfcn.h>
typedef union { int i; double d; float f; char *p;} anytype;
int main()
{
anytype ver2;
anytype (*f)();
void *handle = dlopen("libz.so.1", RTLD_NOW|RTLD_GLOBAL);
f = dlsym(handle,"zlibVersion");
//const char * zlibVersion (void);
ver2=f();
printf("zlib version %s\n", ver2.p);
dlclose(handle);
return 0;
}
答案 0 :(得分:1)
不幸的是,您无法使用union
替换未知类型的返回值。在具有浮点寄存器的体系结构上,浮点返回值在浮点寄存器中返回,而整数或指针返回值在通用寄存器中返回。通常,如果返回值是union或struct,则调用者必须提供指向存储区域(正确大小)的第一个参数,被调用者将使用返回值填充该存储区域。 (有很多变化。它完全依赖于平台ABI;我所描述的是(部分)i386 ABI。)
所以你真的需要知道函数的签名才能调用它。