【发布时间】:2016-02-26 22:37:19
【问题描述】:
当我通过dlopen 使用共享库时,库代码能否“看到”调用dlopen 的进程的内存?例如,我想将一个指向我的应用程序分配的内存的指针传递给库 API。
如果重要的话,我在 Linux/x86 上。
【问题讨论】:
标签: c unix shared-libraries
当我通过dlopen 使用共享库时,库代码能否“看到”调用dlopen 的进程的内存?例如,我想将一个指向我的应用程序分配的内存的指针传递给库 API。
如果重要的话,我在 Linux/x86 上。
【问题讨论】:
标签: c unix shared-libraries
答案是肯定的,可以。这是一个用于说明目的的简单示例。
库代码(在文件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的内存。
【讨论】: