如果在用dlopen()显式加载共享库后删除/替换它,会发生什么?
dlopen()是否将整个共享库加载到内存中?或者从长远来看,dlopen()必须不时地引用以前加载的库,这些库位于文件系统中。如果是,我该如何强制dlopen()将整个.so加载到内存中?
标志RTLD_NOW是否意味着将整个库加载到内存中?
如果在用dlopen()显式加载共享库后删除/替换它,会发生什么?
如果您删除,然后用相同的名称写入一个新文件,则不会发生任何错误。但如果覆盖现有文件,您可能会看到奇怪的崩溃。
dlopen()是否将整个共享库加载到内存中?
否。它只是将其mmap
写入内存。除非在库的代码和数据上使用mlock
,否则将从磁盘按需分页。
标志
RTLD_NOW
是否意味着将整个库加载到内存中?
一点也不。RTLD_NOW
与您的问题无关,也没有帮助。
那么,为什么unlink
+write
与write
在现有数据上存在差异?
在UNIX删除(通过unlink
系统调用)文件时,实际上并不会将其从磁盘中删除——数据保留在磁盘上,直到所有对该文件的引用都消失为止。打开的文件描述符构成了这样的引用,现有的mmap
也是如此。
但是,如果覆盖已经 新的第页。S.正如o11c所指出的,用mmap
ed的现有文件,则请求分页可能会从磁盘中带来ETXTBUSY
覆盖mmap
ed的文件可能会失败,尽管这取决于操作系统和文件系统。