这个问题主要是针对编译Linux平台的共享库(.so文件)。将新的库文件会自动在下一次依赖于它的程序被启动加载?如果没有,是否有不同的方式做实现这一沉默,功能完备的库更新?
许多基于Unix的操作系统有文件系统允许这样的东西,如果您删除,然后重新创建相同的文件。至于弗拉德拉扎连科和我知道,Windows和DOS是不能这样做的唯一操作系统。
只要打开一个文件时,它一直保持到什么都不需要它。当你删除它,它不是在FS可见的,但它仍然存在。它适用于所有类型的文件。
但是,你可能需要在为了做到这一点对库根权限。而且你应该关心多个库之间的同步和依赖。您可以快速跑轰成的情况下里巴V1.0可以libb v1.0和当您自动更新力霸只有工作,它就会失败。
至少有两个著名的程序被使用这种技术:易于和rpm。
编辑:如果你按照删除更新您的图书馆确实没有问题/重建模式。你的老,但在使用磁带库仍然无论是在内存和硬盘上的存在。您的操作系统能够在必要时重新加载磁盘上的库的一部分。
您的图书馆仍然在磁盘上,只要使用它的关闭所有程序。它甚至对libc中的情况。这就是为什么当你更新的libc,你被邀请用它来重新启动几乎所有的服务,以将其更新为新的二进制代码。
而这也是最主要的原因,你可以无需重新启动好几年了热更新的Linux系统。
如果在Linux上,具有良好的Linux文件系统(如ext3和ext4的BTRFS或),你可以一个过程和程序中使用它更新一个共享库(例如libfoo.so
)(例如bar
)(例如dlopen
-ING是libfoo.so
)
你得最好
libfoo.so
到例如libfoo-old.so
libfoo.so
新版本dlsym
你想里面有什么dlopen
-ED句柄旧版本;你只能做到这一点(返回到这样的呼叫帧的时候,否则你的程序会崩溃),如果没有有效呼叫帧点到libfoo-old.so
。libfoo-old.so
(你能避免rename
,你甚至可以unlink
积极dlopen
-ED库;内核会删除它,如果没有进一步的目录项或进程文件描述符指向它,我不会建议,例如,以缓解潜在core
的调试转储)。
一个更简单,但更多的“跑冒滴漏”的替代,是永远不会dlclose
。在实践中,程序可以dlopen
数千*.so
许多打无惧。见我的老manydl.c例子。
为了更好地了解Linux共享库,阅读Drepper的论文How to write shared libraries
您已经收到了一些优秀的答案(尤其是Coreen的),所以我想我会问一个问题。你真的想这样做?除非你是bug修复,并保证不改变函数签名......它可能是一个更好的主意,撞版本号,并部署一个新的版本,不是吗?