繁体   English   中英

如果在使用 dlopen() 显式加载共享库后删除/替换共享库,会发生什么?

[英]What would happen if I delete/replace the shared library after it has been explicit loaded with dlopen()?

如果在使用 dlopen() 显式加载共享库后删除/替换共享库,会发生什么?

dlopen() 是否将整个共享库加载到内存中? 或者从长远来看,dlopen() 必须不时引用驻留在文件系统中的先前加载的库。 如果是这样,我如何强制 dlopen() 将整个 .so 加载到内存中?

标志 RTLD_NOW 是否意味着将整个库加载到内存中?

如果在使用 dlopen() 显式加载共享库后删除/替换共享库,会发生什么?

如果您删除然后写入一个具有相同名称的新文件,则不会发生任何不好的事情。 但是如果您覆盖现有文件,您可能会看到奇怪的崩溃。

dlopen() 是否将整个共享库加载到内存中?

不,它只是将它mmap到内存中。 除非您对库的代码和数据使用mlock ,否则它将从磁盘按需分页

标志RTLD_NOW是否意味着将整个库加载到内存中?

一点也不。 RTLD_NOW与您的问题无关,也无济于事。


那么,为什么会有之间的差异unlink + writewrite在现有的数据?

在 UNIX 上删除(通过unlink系统调用)一个文件实际上并没有从磁盘中删除它——数据保留在磁盘上,直到对文件的所有引用都消失了。 一个打开的文件描述符构成了这样的引用,现有的mmap也是如此。

但是如果你覆盖已经被mmap ed 的现有文件,请求分页可能会从磁盘带来新的内容,可能会带来灾难性的结果。

PS 正如 o11c 所指出的,覆盖mmap ed 的文件可能会因ETXTBUSY而失败,尽管这取决于操作系统和文件系统。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM