【问题标题】:shared libraries and visibility to user's memory共享库和对用户记忆的可见性
【发布时间】:2016-02-26 22:37:19
【问题描述】:

当我通过dlopen 使用共享库时,库代码能否“看到”调用dlopen 的进程的内存?例如,我想将一个指向我的应用程序分配的内存的指针传递给库 API。

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

【问题讨论】:

    标签: c unix shared-libraries


    【解决方案1】:

    答案是肯定的,可以。这是一个用于说明目的的简单示例。

    库代码(在文件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的内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-27
      • 2022-01-08
      • 1970-01-01
      • 2014-11-30
      • 2013-05-22
      • 2022-01-22
      • 2019-08-09
      • 1970-01-01
      相关资源
      最近更新 更多