我理解动态链接的好处(旧代码可以利用库的自动升级,它更节省空间),但它肯定有缺点,特别是在异构的Linux生态系统中。由于系统升级破坏了向后兼容性或在共享库中引入了回归,这使得分发与分发无关的二进制文件变得困难,并且使以前工作的程序更有可能崩溃。
考虑到这些缺点,为什么动态链接似乎是如此普遍的首选?为什么很难找到静态链接的、与发行版无关的Linux二进制文件,即使对于小型应用程序也是如此?
发布于 2011-08-25 02:58:49
主要有三个原因:
dlopen。(这意味着到其他任何东西的静态链接是不值得的,因为你不能得到一个完全静态的二进制文件,如果不替换C library.)您还应该记住,Linux而不是Android的软件生态是完全基于源代码的。如果您正在发布二进制文件,并且您不是发行版供应商,那么您的做法是错误的。
发布于 2011-08-25 08:04:39
我们更喜欢动态链接有几个原因:
基本上,我向您发送针对LGPL libfoo.so.*构建的二进制文件是合法的,甚至可以为您提供该库的二进制文件。我有很多职责,比如响应对LGPL'd库的源代码的请求,但这里重要的是,我不需要把我的程序的源代码也给你。由于glibc是LGPL,并且Linux机器上的几乎每个二进制文件都链接到它,因此仅此一项就会在默认情况下强制进行动态链接。
我公司的主要基于C++的系统打包成大约4MB的RPM,这需要几分钟的时间在我们大多数客户的站点上传慢的DSL上行链路。我们仍然有一些客户也只能通过调制解调器访问,对于这些客户来说,上传就是“开始上传,然后去吃午饭”。如果我们发布静态二进制文件,这些包将会大得多。我们的系统由几个协作程序组成,其中大多数程序都链接到同一组动态库,因此RPM将包含相同共享代码的冗余副本。压缩可以挤出其中的一部分,但为什么每次升级都要一次又一次地提供它呢?
我们确实单独发布了一些库,这些库不是操作系统的一部分,但它们必须比我们的代码更改得少得多。通常,当我们构建服务器时,这些都会安装在系统上,然后再也不会更新。这是因为我们通常对稳定性更感兴趣,而不是这些库中的新特性。只要他们还在工作,我们就不会碰他们。
https://stackoverflow.com/questions/7180550
复制相似问题