如果我在同一应用程序运行中两次在同一个lib/文件上使用dlopen,在两种情况下都会产生相同的句柄吗?是否有任何保证(简短的实验表明,至少在我的盒子上可以做到)?
我目前正在玩一个小的插件系统(出于好奇),如果对此观察到的行为有某种保证,我可以将此地址用作插件的键,以防止重复加载。
最佳答案
是的。 dlopen(3) Linux手册页显示:
顺便说一句,在Linux系统上,您可以dlopen很多(成千上万)共享库,如我的manydl.c示例所示。主要限制是地址空间。
因此,实际上,不必担心dlclose
-ing东西是可能的。
(除非您的dlopen版本共享库具有怪异的或消耗资源的构造函数或析构函数)
2017年12月新增:
注意,相关的是传递给dlopen
的确切路径字符串。因此,如果您使用"./foo.so"
和"././foo.so"
(或"../foosymlink.so"
,其中foosymlink.so
是到foo.so
的符号链接(symbolic link)),则dlopen句柄会有所不同,并且在某些情况下,该共享库的两个实例可能会发生奇怪的行为。
在2019年6月添加:
另请阅读Drepper的How to write shared libraries文件(它也很好地解释了如何使用它们!)。
关于c - 对于具有相同文件的两个调用,dlopen是否会产生相同的句柄?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12148454/