如果我在同一应用程序运行中两次在同一个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/

10-11 21:45