动态库函数调用

时间:2012-04-29 18:04:59

标签: c linux dlsym

我有以下代码,它只是从当前目录加载库test.so并执行该库中的version函数。应该返回的是一个字符串。而返回的是从堆栈中丢失的垃圾(指针位置可能是?)。有没有人知道为什么以下代码会失败。

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

int main(int argc, char **argv){
    void *handler;
    char *(*version);
    char *error;

    handler = dlopen("./test.so", RTLD_LAZY);
    if(!handler){
        fprintf(stderr, "%s\n", dlerror());
        exit(EXIT_FAILURE);
    }

    dlerror(); //Flushes any existing error

    *(void **)(&version) = dlsym(handler, "version");

    if((error = dlerror()) != NULL){
        fprintf(stderr, "%s\n", error);
        exit(EXIT_FAILURE);
    }
    printf("%s\n", version);
    dlclose(handler);
    exit(EXIT_SUCCESS);
}

3 个答案:

答案 0 :(得分:4)

更改声明:

char *(*version); // this is not a function pointer

为:

char *(*version)(); // but this is

然后,更改行:

printf("%s\n", version);

为:

printf("%s\n", version());

答案 1 :(得分:3)

dlsym只返回一个函数指针。你仍然需要实际调用它,你可以通过将(void *)转换为适当类型的函数指针并调用它来做。

答案 2 :(得分:2)

您的代码中有两个错误:

version的声明:它是指向代码中指向char的指针,这导致您进行奇怪的转换:

*(void **)(&version) = dlsym(handler, "version");

而是使用指向函数的指针返回指向char的指针,如下所示:

char *(*version)();

并使用常规作业:

version = dlsym(handler, "version");

打印结果时,您没有调用该函数。在C中,只写函数名称会返回其地址,因此version&version是等效的。您的代码应该是:

printf("%s\n", version());