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

时间:2016-02-26 22:37:19

标签: c unix shared-libraries

当我通过dlopen使用共享库时,库代码可以“查看”调用dlopen的进程内存吗?例如,我想将指针传递给我的应用程序分配给库API的内存。

如果重要的话,我在Linux / x86上。

1 个答案:

答案 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的内存。