在 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);
/* ^ */
您正在按值传递指针并且正在更改指针(参数)的本地值。发送指针的地址以反映调用函数的变化。
我在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);
/* ^ */
您正在按值传递指针并且正在更改指针(参数)的本地值。发送指针的地址以反映调用函数的变化。