通过覆盖它自己的文件在磁盘上新版本的C / C ++ Linux可以共享库自动更新吗?

问题描述 投票:3回答:3

这个问题主要是针对编译Linux平台的共享库(.so文件)。将新的库文件会自动在下一次依赖于它的程序被启动加载?如果没有,是否有不同的方式做实现这一沉默,功能完备的库更新?

c++ linux shared-libraries auto-update
3个回答
6
投票

许多基于Unix的操作系统有文件系统允许这样的东西,如果您删除,然后重新创建相同的文件。至于弗拉德拉扎连科和我知道,Windows和DOS是不能这样做的唯一操作系统。

只要打开一个文件时,它一直保持到什么都不需要它。当你删除它,它不是在FS可见的,但它仍然存在。它适用于所有类型的文件。

但是,你可能需要在为了做到这一点对库根权限。而且你应该关心多个库之间的同步和依赖。您可以快速跑轰成的情况下里巴V1.0可以libb v1.0和当您自动更新力霸只有工作,它就会失败。

至少有两个著名的程序被使用这种技术:易于和rpm。

编辑:如果你按照删除更新您的图书馆确实没有问题/重建模式。你的老,但在使用磁带库仍然无论是在内存和硬盘上的存在。您的操作系统能够在必要时重新加载磁盘上的库的一部分。

您的图书馆仍然在磁盘上,只要使用它的关闭所有程序。它甚至对libc中的情况。这就是为什么当你更新的libc,你被邀请用它来重新启动几乎所有的服务,以将其更新为新的二进制代码。

而这也是最主要的原因,你可以无需重新启动好几年了热更新的Linux系统。


4
投票

如果在Linux上,具有良好的Linux文件系统(如ext3和ext4的BTRFS或),你可以一个过程和程序中使用它更新一个共享库(例如libfoo.so)(例如bar)(例如dlopen-ING是libfoo.so

你得最好

  1. rename(2)libfoo.so到例如libfoo-old.so
  2. dlopen(3) libfoo.so新版本
  3. dlsym你想里面有什么
  4. 或许dlclose(3)dlopen-ED句柄旧版本;你只能做到这一点(返回到这样的呼叫帧的时候,否则你的程序会崩溃),如果没有有效呼叫帧点到libfoo-old.so
  5. 如果需要unlink(2)libfoo-old.so

(你能避免rename,你甚至可以unlink积极dlopen-ED库;内核会删除它,如果没有进一步的目录项或进程文件描述符指向它,我不会建议,例如,以缓解潜在core的调试转储)。

一个更简单,但更多的“跑冒滴漏”的替代,是永远不会dlclose。在实践中,程序可以dlopen数千*.so许多打无惧。见我的老manydl.c例子。

还阅读dynamic software updating

为了更好地了解Linux共享库,阅读Drepper的论文How to write shared libraries


1
投票

您已经收到了一些优秀的答案(尤其是Coreen的),所以我想我会问一个问题。你真的想这样做?除非你是bug修复,并保证不改变函数签名......它可能是一个更好的主意,撞版本号,并部署一个新的版本,不是吗?

© www.soinside.com 2019 - 2024. All rights reserved.