C插件系统

时间:2016-04-21 19:01:10

标签: c plugins gnu dlopen dlsym

我正在使用dlopendlsym使用共享的objetcs为C编写shell的插件系统。

我想知道共享对象中的函数是否在同一个对象中使用了全局,当加载dlopendlsym然后dlclose时,该函数是否仍可用于该函数?

如果没有,那么在动态加载后,共享对象中两个函数的相互通信方式是什么?

谢谢

2 个答案:

答案 0 :(得分:1)

您的问题可能取决于共享对象格式和实现的性质。由于你标记了你的问题[gnu],你最有可能的目标格式可能是ELF,几乎所有现代Linux和许多其他类型的Unix使用的格式。

  

我想知道共享对象中的函数是否在同一个对象中使用全局,当使用dlopen,dlsym和dlclose加载时,该函数是否仍然可用于该函数?

使用ELF,是的,除非动态链接器在其搜索路径中找到一个具有相同名称的不同全局。另请注意,dlopen()共享对象使其内容的可用方式多于仅通过dlsym()。动态链接器处理这些对象的方式与它自动加载程序的共享库的方式非常相似。

阅读Ulrich Drepper's description of DSOs and the dynamic linking process可能值得您花些时间。这是非常好的,并且就像这种复杂性的主题一样容易阅读。 (这与说它很容易阅读完全不同。)

答案 1 :(得分:0)

当一个进程加载一个库时,该库将在进程空间中拥有自己的内存空间,其中将存储其静态数据。

如果在同一进程中加载​​了两个库,它们共享进程内存空间,这意味着库可以从另一个库中读取数据....如果我们知道在哪里读取...

解决问题的一个简单方法是在插件加载器中安装可从插件调用的函数,以便:

  • 创建此类共享对象,例如void PLUGIN_createFooObject();
  • 获取此对象的指针,例如void *PLUGIN_getFooObject();
  • 清理已创建的数据,例如void PLUGIN_deleteFooObject();