dlopen会为同一个文件的两个调用产生相同的句柄吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dlopen会为同一个文件的两个调用产生相同的句柄吗?相关的知识,希望对你有一定的参考价值。

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

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

答案

是。 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系统上,你可以提供很多(数十万)共享库,正如我的例子manydl.c所展示的那样。主要限制是地址空间。所以实际上,不用担心dlclose-ing的东西是可能的。

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

2017年12月新增:

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

以上是关于dlopen会为同一个文件的两个调用产生相同的句柄吗?的主要内容,如果未能解决你的问题,请参考以下文章

dlopen / dlsym函数(动态链接库)

通过dlopen使用动态库

Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 获取 linker 中的 dlopen 函数地址 并 通过 远程调用 执行该函数 )

dlopen / dlsym函数(动态链接库)

用dlopen和dlsym得到的符号 在dlclose后还能继续使用么

文件句柄