我正在使用dlopen
和dlsym
和共享的objetcs为C中的shell编写插件系统。
我想知道共享对象中的函数是否在同一个对象中使用全局变量,在加载dlopen
,dlsym
然后dlclose
时,该变量是否仍可用于该函数?
如果不是,在动态加载后如何使共享库中的两个函数相互通信?
谢谢
最佳答案
您的问题可能取决于共享对象格式和实现的性质。由于您标记了问题[gnu],因此最有可能成为您目标的格式可能是ELF,几乎所有现代Linux以及其他许多Unix版本都使用了ELF。
我想知道共享对象中的函数是否在同一个对象中使用全局变量,在先加载dlopen,dlsym然后再加载dlclose时,该变量是否仍可用于该函数?
对于ELF,是的,除非动态链接程序在其搜索路径中较早地找到具有相同名称的其他全局变量。还要注意,dlopen()
共享对象使内容的可用方式不仅仅是通过dlsym()
。动态链接器对待此类对象的方式几乎与处理程序自动加载的共享库的方式相同。
阅读Ulrich Drepper's description of DSOs and the dynamic linking process可能值得您花些时间。它非常好,并且以这种复杂的主题为您所希望的那样易于阅读。 (这与说这很容易理解完全不同。)