8

如果我在同一个应用程序运行中对同一个库/文件使用 dlopen 两次,它会在两种情况下产生相同的句柄吗?对此有什么保证吗(一个简短的实验表明它至少在我的盒子上是这样)?

我目前正在玩一个小插件系统(出于好奇),如果对这种观察到的行为有某种保证,我可以使用这个地址作为插件的键来防止重复加载。

4

1 回答 1

15

是的。dlopen(3) linux手册页说:

   If the same library is loaded again with dlopen(), the same file 
   handle is returned. The dl library maintains reference counts for 
   library handles, so a dynamic library is not deallocated until 
   dlclose() has been called on it as many times as dlopen() 
   has succeeded on it.

顺便说一句,在 Linux 系统上,您可以 dlopen 很多(数十万个)共享库,正如我的示例manydl.c所示。主要限制是地址空间。所以实际上,不用担心dlclose-ing 的东西是可能的。

(除非你的 dlopen-ed 共享库有奇怪的或消耗资源的构造函数或析构函数)

2017 年 12 月新增:

请注意,相关的是传递给dlopen. 因此,如果您使用"./foo.so"and "././foo.so"(或 符号链接"../foosymlink.so"在哪里),dlopen-ed 句柄是不同的,并且在某些情况下,可能会发生该共享库的两个实例的奇怪行为。 foosymlink.sofoo.so

2019 年 6 月添加:

另请阅读 Drepper 的如何编写共享库论文(它也很好地解释了如何使用它们!)。

于 2012-08-27T19:40:23.480 回答