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



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

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

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

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

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

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

否。它只是将其mmap写入内存。除非在库的代码和数据上使用mlock,否则将从磁盘按需分页。

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

一点也不。RTLD_NOW与您的问题无关,也没有帮助。


那么,为什么unlink+writewrite在现有数据上存在差异?

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

但是,如果覆盖已经mmaped的现有文件,则请求分页可能会从磁盘中带来

新的第页。S.正如o11c所指出的,用ETXTBUSY覆盖mmaped的文件可能会失败,尽管这取决于操作系统和文件系统。

相关内容

  • 没有找到相关文章

最新更新