2010-08-06 138 views
3

我遇到了一个奇怪的问题。 我有两个文件AC和BC如下: BC:无法调用返回指针的函数指针

#include <stdlib.h> 

int *foo() { 
    int *x; 
    x = (int *) malloc(sizeof(int)); 
    *x = 4; 
    return x; 
} 

我编译BC使用gcc来b.so: $ gcc的-o b.so -shared -fpic

交流:

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

int main() { 
    void *hdl; 
    hdl = dlopen("./b.so", RTLD_LAZY); 
    int *((*fn)(void)); 
    int *x; 
    x = (*fn)(); 
    fn = dlsym(hdl, "foo"); 
    printf("%d", *x); 
} 

我使用编译AC GCC:

$ gcc的-fpic -ldl交流

现在,当我运行它:

$ ./a.out 分段故障

在那里我我的问题呢? 这在b.c中的函数没有返回指针时有效。

此外,我尝试使用dlerror()检查错误,但它没有报告。

回答

6

通过检查,您在初始化之前使用fn。它还没有指向foo,它还没有指向任何特别的东西,我怀疑结果的行为是未定义的。

+1

初始化(或分配一个值到它),而不是限定。变量'fn'在使用前定义。 – 2010-08-06 05:59:29

+0

哦,谢谢,那是我相信的一个错字。 现在,它的工作。 – Nilesh 2010-08-06 07:41:59

+0

@Georg Fritzsche:Sie haben recht,danke。 – Beta 2010-08-06 17:37:10

3

可能只是一个你的榜样问题,但在您提供的代码,你需要切换下面几行:

x = (*fn)(); 
fn = dlsym(hdl, "foo"); 
4

您没有找到符号,并调用该函数。

当你做x = (*fn)();它没有打电话给功能foob.c

您必须先将符号加载到函数指针中。

int *x; 
    fn = dlsym(hdl, "foo"); 
    x = fn(); 
    printf("%d", *x); 

以上应该工作。

编辑:

对dlopen的,则dlsym示例程序可以发现here与同一个男人页面信息。

+0

我使用相同的来源学习如何生成.so文件并使用它们:) – Nilesh 2010-08-06 12:19:14

3

这两行似乎是错误的顺序:

x = (*fn)(); 
fn = dlsym(hdl, "foo");