Linux的静态链接已经死了?

事实上,Linux上的静态 gcc标志现在不起作用。 让我引用GNU libc FAQ:

2.22。 即使静态链接程序需要一些共享库,这是我不能接受的。 我能做什么?

如果没有共享库,{AJ} NSS(仅仅input`info libc“Name Service Switch”')将无法正常工作。 NSS允许通过更改一个configuration文件(/etc/nsswitch.conf)而不用重新连接任何程序来使用不同的服务(例如NIS,文件,db,hesiod)。 唯一的缺点是现在静态库需要访问共享库。 这是由GNU C库透明地处理的。

一个解决scheme是使用–enable-static-nssconfigurationglibc。 在这种情况下,您可以创build一个只使用服务dns和文件的静态二进制文件(为此更改/etc/nsswitch.conf)。 您需要明确链接所有这些服务。 例如:

gcc -static test-netdb.c -o test-netdb \ -Wl,--start-group -lc -lnss_files -lnss_dns -lresolv -Wl,--end-group 

这种方法的问题是,你必须链接每个使用NSS例程的静态程序和所有这些库。
{UD}实际上,我们不能说使用这个选项编译的libc正在使用NSS。 没有开关了。 因此, 强烈build议不要使用–enable-static-nss,因为这会使系统上的程序行为不一致。

关于这个事实,现在有没有什么合理的方法来在Linux上创build一个全function的静态构build,或者静态链接在Linux上完全失效? 我的意思是静态构build:

  • 行为与dynamic构build完全相同(static-nss具有不一致的行为是邪恶的!
  • 适用于glibc环境和Linux版本的合理变体;

关于这个事实,现在有没有什么合理的方法来在Linux上创build一个全function的静态构build,或者静态链接在Linux上完全失效?

我不知道在哪里可以find历史的参考,但是,GNU系统的静态链接已经死了。 (我相信它是在从libc4 / libc5转换到libc6 / glibc 2.x的过程中死掉的)

该function被认为是无用的:

  • 安全漏洞。 静态链接的应用程序甚至不支持libc的升级。 如果应用程序在包含lib漏洞的系统上被链接,那么它将在静态链接的可执行文件中永久存在。

  • 代码膨胀。 如果很多静态链接的应用程序在同一个系统上运行,那么标准库将不会被重用,因为每个应用程序都包含一切内容。 (尝试du -sh /usr/lib来了解问题的严重程度。)

尝试挖掘10 – 15年前的LKML和glibc邮件列表档案。 我很确定很久以前,我看到了一些与LKML相关的东西。

我认为这是非常烦人的,我认为将某个特性称为“无用”是一种傲慢的行为,因为它在处理某些用例时遇到了问题。 glibc方法的最大问题在于它对系统库(gconv和nss)进行硬编码,因此当人们试图在一个与构build的Linux发行版不同的Linux发行版上运行一个静态二进制文件时,它就会中断。

无论如何,你可以通过设置GCONV_PATH指向适当的位置来解决gconv问题,这使我能够在Ubuntu上构build二进制文件并在Red Hat上运行它们。

仅仅因为你必须dynamic链接到NSS服务并不意味着你不能静态链接到任何其他库。 所有这些常见问题都是说,即使是“静态”链接的程序也有一些dynamic链接的库。 这并不是说静态链接是“不可能的”,或者说“不起作用”。

静态链接在Linux世界似乎没有太多的爱。 这是我的要求

没有看到静态链接的吸引力的人通常在内核和底层操作系统的领域工作。 很多* nix的图书馆开发者已经花了一生的时间来处理将不断变化的图书馆连接起来的不可避免的问题,这是他们每天都要做的工作。 看看autotools,如果你想知道他们舒服的后空翻表演。

但是不应该指望其他人花大部分时间在这个上面。 静态链接将使你从图书馆stream失缓冲很长的路要走。 开发人员可以根据软件的时间表升级软件的依赖关系,而不是在新的库版本出现的时候强制执行。 这对于具有复杂用户界面的面向用户的应用程序非常重要,这些用户界面需要控制许多底层库的stream量,而这些底层库依赖于这些库。 这就是为什么我会永远是静态链接的粉丝。 如果您可以静态链接交叉编译的可移植C和C ++代码,那么您几乎可以将世界变成您的牡蛎,因为您可以更快速地将复杂的软件交付到各种世界不断增长的设备中。

从其他angular度来看,还有很多不同意的地方,开源软件可以满足所有人的需求。

添加其他答案:

由于其他答案中提到的原因,不推荐大多数Linux发行版,但实际上有一些专门用于运行静态链接二进制文件的发行版:

  • stali
  • 睡眠
  • starchlinux
  • bifrost

从stali描述:

静态Linux是基于每个任务的最佳工具的手选集合和每个工具静态链接(包括一些X客户端,如ST,冲浪,dwm,dmenu),

它还通过避免glibc和其他臃肿的GNU库(如果可能,早期的实验显示,静态链接的二进制文件通常比dynamic链接的glibc文件更小)来实现二进制大小的减less。 请注意,这与Ulrich Drepper认为静态链接相反。

由于静态链接二进制文件启动速度较快的副作用,分发也是以性能增益为目标的。

静态链接也有助于减less依赖。

你可以在这个关于静态链接和dynamic链接的问题上阅读更多。