现代Linux发行版中共享库真正节省了多少磁盘空间?

Emi*_*ier 4 linux shared-libraries static-libraries

在静态与共享库的争论中,我经常听说共享库消除了重复并减少了整体磁盘空间.但是现代Linux发行版中共享库真正节省了多少磁盘空间?如果使用静态库编译所有程序,还需要多少空间?有没有人为像Ubuntu这样的典型桌面Linux发行版碾压数字?有统计数据吗?

附录:

所有的答案都提供了丰富的信息并且受到了赞赏,但他们似乎都在抨击我的问题而不是试图回答它.Kaleb走在了正确的轨道上,但他选择了内存空间而不是磁盘空间的数字(我的问题是磁盘空间).

因为程序只为他们使用的静态库部分"付费",所以几乎不可能定量地知道所有静态与所有共享的磁盘空间差异.

我觉得现在我的问题很糟糕,我意识到这几乎是不可能回答的.但我会留在这里以保留信息丰富的答案.

所以SO停止唠叨我选择一个答案,我将选择最受欢迎的一个(即使它回避问题).

Ign*_*ams 9

我不确定你在哪里听到这个,但减少的磁盘空间大多是一个红色的鲱鱼,因为驱动器空间接近每千兆字节便士.共享库的真正好处是为这些库提供了安全性和错误修复更新; 使用静态库的应用程序必须使用新库单独重建,而使用共享库的所有应用程序只需更换少量文件即可立即更新.

  • @earlz:当API中断时,库的SONAME增加到下一个第二个数字,以便较旧的可执行文件可以继续使用旧库.现代包管理器处理库的多个版本并不困难. (2认同)

And*_*gor 6

共享库不仅可以节省磁盘空间,还可以节省内存,而且更重要.预链接步骤在这里很重要...你不能在同一个库的两个实例之间共享内存页面,除非它们被加载到同一个地址,并且预链接允许这种情况发生.

  • @loan共享对象可以节省RAM.在进程的地址空间中拥有库的副本并不意味着内存中的每个进程都有一个库的物理副本.相反,动态链接器将共享库的页面映射到地址空间,并使用copy-on-write,这样如果进程更改共享库中的内存,它就会获得它自己的副本.包含共享库代码的页面可能不会更改,因此不会被复制. (4认同)
  • @Jay:几乎所有应用程序都使用libc运行. (2认同)