【发布时间】:2021-10-21 02:24:10
【问题描述】:
如果我在使用 dlopen() 显式加载共享库后删除/替换共享库会发生什么?
dlopen() 是否将整个共享库加载到内存中? 或者从长远来看,dlopen() 必须不时引用驻留在文件系统中的先前加载的库。 如果是这样,我如何强制 dlopen() 将整个 .so 加载到内存中?
标志 RTLD_NOW 是否意味着将整个库加载到内存中?
【问题讨论】:
-
这真是一个关于
mmap的问题。如果您进行“正确”安装(写入新文件,然后重命名),则 inode 仍然可以访问,直到没有其他人使用它。如果您尝试直接写入文件,您会得到ETXTBSY(请注意,手册页具有误导性)。 -
实际上,看起来只有可执行文件才能获得
ETXTBUSY;库只会导致奇怪的崩溃。