C插件系统

C plugin system

我正在用 C 使用 dlopendlsym 以及共享对象为 shell 编写插件系统。

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

如果不是,共享对象中的两个函数在动态加载后如何相互通信?

谢谢

当一个库被一个进程加载时,这个库将有自己的内存space,在进程space中,其中将存储它的静态数据。

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

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

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

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

I wonder if a function in a shared object use a global in the same object, would the variable still be available for the function when loaded with dlopen, dlsym and then dlclose?

对于 ELF,是的,除非动态链接器在其搜索路径的较早位置找到具有相同名称的不同全局。另请注意,dlopen()共享对象可以通过更多方式提供其内容,而不仅仅是通过 dlsym()。动态链接器处理此类对象的方式与处理自动随程序加载的共享库的方式几乎相同。

您可能值得花时间阅读 Ulrich Drepper's description of DSOs and the dynamic linking process。它非常好,而且对于如此复杂的主题,它就像您希望的那样易于阅读。 (这与说它很容易阅读是完全不同的。)