当我通过dlopen
使用共享库时,库代码能否“看到”调用dlopen
的进程的内存?例如,我想将指向由我的应用程序分配的内存的指针传递给库 API。
如果它很重要,我会使用 Linux/x86。
最佳答案
答案是肯定的,可以。这是一个用于说明目的的简单快速示例。
库代码(在文件 myso.c
中):
void setInt( int * i )
{
*i = 12345;
}
库可以按如下方式构建:
gcc -c -fPIC myso.c
gcc -shared -Wl,-soname,libmy.so -o libmy.so myso.o -lc
这是客户端代码(main.c
):
#include <stdio.h>
#include <dlfcn.h>
typedef void (*setint_t)( int * );
int main()
{
void * h = dlopen("./libmy.so", RTLD_NOW);
if (h)
{
puts("Loaded library.");
setint_t setInt = dlsym( h, "setInt" );
if (setInt) {
puts("Symbol found");
int k;
setInt(&k);
printf("The int is %d\n", k);
}
}
return 0;
}
现在构建并运行代码。确保 main.c 和库在同一个目录中,我们在其中执行以下命令:
user@fedora-21 ~]$ gcc main.c -ldl
[user@fedora-21 ~]$ ./a.out
Loaded library.
Symbol found
The int is 12345
如您所见,该库能够写入整数 k
的内存。
关于c - 共享库和用户内存的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35663025/