2010-08-06 134 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");