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

Failed to get void ponter as function arguments while calling function from application to Dynamic Loaded Library in Linux

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

我在该函数中使用了 mmap 调用,它成功地映射了内存。

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

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 调用的内存的地址。

有人知道这个问题吗?

将您的 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);
/*                   ^      */

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