首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么没有更多地使用静态链接?

为什么没有更多地使用静态链接?
EN

Stack Overflow用户
提问于 2011-08-25 02:39:37
回答 2查看 2.5K关注 0票数 10

我理解动态链接的好处(旧代码可以利用库的自动升级,它更节省空间),但它肯定有缺点,特别是在异构的Linux生态系统中。由于系统升级破坏了向后兼容性或在共享库中引入了回归,这使得分发与分发无关的二进制文件变得困难,并且使以前工作的程序更有可能崩溃。

考虑到这些缺点,为什么动态链接似乎是如此普遍的首选?为什么很难找到静态链接的、与发行版无关的Linux二进制文件,即使对于小型应用程序也是如此?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-25 02:58:49

主要有三个原因:

  1. GNU libc不支持到自身的静态链接,因为它在内部大量使用了dlopen。(这意味着到其他任何东西的静态链接是不值得的,因为你不能得到一个完全静态的二进制文件,如果不替换C library.)
  2. Distributions就不支持到其他任何东西的静态链接,因为它增加了当一个库有一个安全vulnerability.
  3. Distributions对与发行版无关的二进制文件没有任何兴趣时,他们必须做的工作量。他们希望获得源代码并自己构建。

您还应该记住,Linux而不是Android的软件生态是完全基于源代码的。如果您正在发布二进制文件,并且您不是发行版供应商,那么您的做法是错误的。

票数 15
EN

Stack Overflow用户

发布于 2011-08-25 08:04:39

我们更喜欢动态链接有几个原因:

  1. Licensing.这是LGPL的一个特殊问题,尽管还有其他具有类似限制的许可证。

基本上,我向您发送针对LGPL libfoo.so.*构建的二进制文件是合法的,甚至可以为您提供该库的二进制文件。我有很多职责,比如响应对LGPL'd库的源代码的请求,但这里重要的是,我不需要把我的程序的源代码也给你。由于glibc是LGPL,并且Linux机器上的几乎每个二进制文件都链接到它,因此仅此一项就会在默认情况下强制进行动态链接。

  1. Bandwidth耗费的成本。人们喜欢说带宽是免费的,但这只在原则上是正确的。在许多实际情况下,带宽仍然很重要。

我公司的主要基于C++的系统打包成大约4MB的RPM,这需要几分钟的时间在我们大多数客户的站点上传慢的DSL上行链路。我们仍然有一些客户也只能通过调制解调器访问,对于这些客户来说,上传就是“开始上传,然后去吃午饭”。如果我们发布静态二进制文件,这些包将会大得多。我们的系统由几个协作程序组成,其中大多数程序都链接到同一组动态库,因此RPM将包含相同共享代码的冗余副本。压缩可以挤出其中的一部分,但为什么每次升级都要一次又一次地提供它呢?

  1. Management.我们链接的许多库都是操作系统发行版的一部分,因此我们可以独立于我们的程序获得这些库的免费更新。我们不需要管理它。

我们确实单独发布了一些库,这些库不是操作系统的一部分,但它们必须比我们的代码更改得少得多。通常,当我们构建服务器时,这些都会安装在系统上,然后再也不会更新。这是因为我们通常对稳定性更感兴趣,而不是这些库中的新特性。只要他们还在工作,我们就不会碰他们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7180550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档