从C中的共享库访问主程序

时间:2013-11-18 14:23:21

标签: c shared-libraries

经过一些谷歌搜索,我得到了共享库很好的工作。我可以使用dlopen打开我的模块,并使用dlsym加载函数。但是,这总是在程序库中运行函数,如何使用库中程序的函数?

我的简化代码:

的main.c

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>


int twice(int a){
    return a*2;
}

int main(int argc, char ** argv){
   char *plugin_name;
   void *plugin;
   int (*init)();
   if(argc<2){
      printf("give lib name\n");
      return 0;
   }
   plugin = dlopen (argv[1], RTLD_NOW);
   if (!plugin)
   {
      printf("Cannot load %s: %s\n",argv[1], dlerror ());
      return 0;
   }

  init = dlsym (plugin, "init");
  char * result = dlerror ();
  if (result)
  {
      printf("Cannot find init in %s: %s\n", plugin_name, result);
      return 0;
  }
  int res = init();
  printf("result: %i\n",res);
  return 0;
}

plugin.c

int init()
{
    return twice(4);
}

生成文件:

all: main lib

main: main.c
    gcc -ldl -o main main.c

lib: plugin.c
    gcc -shared -o plugin.so plugin.c

我用它来运行:

./main ./plugin.so

1 个答案:

答案 0 :(得分:0)

使用Linux,glibc和GNU ld,您可以将-rdynamic运行到可执行链接标志。这将使可执行文件中的所有符号对可加载模块可见,就像它是共享库一样。

请注意,这不一定可以移植到其他类Unix系统。