0

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

如何使以下代码工作?

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

1 回答 1

1

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

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

于 2013-04-25T17:26:00.467 回答