dl'ed函数的泛型返回类型

时间:2013-04-25 17:13:31

标签: c dynamic-loading

嗨我动态加载函数并执行它们。我希望能够定义泛型返回类型,以便编译器可以正确清理堆栈。目前它的版本字符串打印乱码。

如何使以下代码生效?

// 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;
}

1 个答案:

答案 0 :(得分:1)

不幸的是,您无法使用union替换未知类型的返回值。在具有浮点寄存器的体系结构上,浮点返回值在浮点寄存器中返回,而整数或指针返回值在通用寄存器中返回。通常,如果返回值是union或struct,则调用者必须提供指向存储区域(正确大小)的第一个参数,被调用者将使用返回值填充该存储区域。 (有很多变化。它完全依赖于平台ABI;我所描述的是(部分)i386 ABI。)

所以你真的需要知道函数的签名才能调用它。