c - 共享库和用户内存的可见性

标签 c unix shared-libraries

当我通过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/

相关文章:

使用 sscanf 比较字符串,但忽略空格

c++ - openMPI 数据类型可移植性

perl - 我可以使用一个模块,然后卸载它以缩小 Optree 吗?

java - Spring引导-设置PERL5LIB

regex - 使用正则表达式提取子字符串同时排除某个短语

c++ - 使用具有最少 C++/SWIG/Lua 代码的共享 dll 的链接错误

gcc - 如何使用内置的 rpath 构建和安装 gcc?

c++ - 在使用 dlopen() 加载共享对象之前如何确定 cxxabi?

c - 如何在线程/进程之间可移植地共享变量?

oracle - 使用UNIX shell脚本建立数据库连接