当我通过dlopen
使用共享库时,库代码可以“查看”调用dlopen
的进程内存吗?例如,我想将指针传递给我的应用程序分配给库API的内存。
如果重要的话,我在Linux / x86上。
答案 0 :(得分:2)
答案是肯定的,它可以。这是一个简单的快速示例,用于说明目的。
库代码(在文件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
的内存。