在将应用程序中的函数调用到Linux中的动态加载库时,无法将void ponter作为函数参数

时间:2015-05-28 07:17:34

标签: c linux pointers dll

我在Linux OS中创建了一个动态库。有一个名为test的函数,其中一个参数为void *buffer

我在该函数中使用了mmap调用,该函数成功映射内存而没有任何问题。

我已将该内存映射到动态加载库中的一个全局char *缓冲区。

void * buffer;

int test(void *buffer_app)
{
   buffer = (char *)mmap(0, buffer_size, PROT_READ | PROT_WRITE, MAP_SHARED,  
   fd, 0);

   buffer_app = (char *)buffer;
   return 0;
}

然后,我创建了一个命令行测试应用程序,它将使用dlopen函数打开该动态库。

以上所有内容均符合要求。

之后,我将一个void *buffer保留为全局内部命令行测试应用程序,并将其作为测试函数的参数传递给映射来自dll的内存。

void *buffer;

int main()
{
    void *handle;
    int status = 0;
    handle = dlopen("libtest.so", RTLD_NOW  | RTLD_GLOBAL);

    dlerror();    /* Clear any existing error */

    giPtr = dlsym(handle, "GI_Funcs");

    status = giPtr->test(buffer);

}

所以,我得到缓冲区的地址为0x0而不是指向动态库中mmap调用的内存的地址。

有没有人对这个问题有所了解?

1 个答案:

答案 0 :(得分:1)

将您的dll功能更改为:

int test(void *buffer_app)
{
   buffer = (char *)mmap(0, buffer_size, PROT_READ | PROT_WRITE, MAP_SHARED,  
   fd, 0);

   *(char **)buffer_app = buffer;  /* Optional: No need to cast */
/* ^                           */
   return 0;
}

后来称之为:

status = giPtr->test(&buffer);
/*                   ^      */

您正在按值传递指针,并且正在更改指针(参数)的本地值。发送指针的地址以反映调用者函数的变化。