gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:51:51 28 4
gpt4 key购买 nike

我在 Linux 操作系统中创建了一个动态库。有一个名为 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);
/* ^ */

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

关于c - 在 Linux 中从应用程序调用函数到动态加载库时无法将 void ponter 作为函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30499700/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com