我应该在dlopen之前锁定

should I lock before dlopen?

本文关键字:锁定 dlopen 我应该      更新时间:2023-10-16

i确实有一个 *.so库,该库使用dlopen从系统库中获取一些信息。库可以同时由多个应用程序使用。也许这是一个愚蠢的问题,但是我应该在上面做dlopen之前蜂拥而至吗?我在任何地方都没有找到直接答案。

与评论中所说的类似,您不需要信号量(羊群),除非您访问可能会改变您的共享资源。(即访问共享内存并需要确保该数据并发)。动态加载的方式... dlopen()...工作

这两个例程实际上是简单的包装器,可以回到动态链接器。当动态链接器通过dlopen(),它执行相同的重定位和符号分辨率任何其他库,因此动态加载程序可以没有任何特殊安排回电回到已经加载的例程

由于链接的工作方式,因此在(调用dlopen的过程)的内存空间中完成了对got/plt的修改,而不是映射共享对象的位置。

如果一百个过程使用共享库,那么拥有内存中的100份代码副本占据了空间。如果代码是完全只读,因此,从来没有修改过

将共享对象放在只读的内存中,您永远不必担心它们突然变化,因此不需要羊群:)!

注意:因为您有一个共享对象链接到其他共享对象...最初的共享对象的获取需要更新/mod,并使用dlopen()加载的库的重新定位...但是存储在过程的r/w段中,而不是共享对象的内存空间。

共享库必须在每个中都有一个未Qiue数据实例流程...读写数据部分始终放在已知的偏移范围内摘自库的代码部分。这样,通过虚拟内存,每个过程都会看到自己的数据部分,但可以共享未修改的代码