我在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调用的内存的地址。
有没有人对这个问题有所了解?
答案 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);
/* ^ */
您正在按值传递指针,并且正在更改指针(参数)的本地值。发送指针的地址以反映调用者函数的变化。