2013-04-25 102 views
0

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

我怎样才能让下面的代码工作?

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

使用的是精确匹配被调用的函数的函数指针类型。在这种情况下,将'f'定义为'const char *(* f)(void)'。尽管你的代码应该按照原样工作,但没有理由按照你的方式去做。 – 2013-04-25 17:23:00

+0

@ nm肯定有一个原因!这有点像Visual C Edit-and-Continue的工作原理。 – Mastertronic 2013-04-25 17:30:50

+0

我敢肯定的Visual C编辑并继续无关用'dlopen'和'RTLD_GOLBAL'任何责任。即使Visual C++中的某些代码与您所写的内容相似,这对任何在该环境之外进行编程的人,也可能对于在其中工作的人而言绝对没有任何意义。 – 2013-04-25 17:37:08

回答

1

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

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