为什么不可能完全静态链接应用程序?

时间:2011-11-15 17:22:48

标签: linux linker static-linking

我正在尝试使用GCC编译静态链接的二进制文件,我收到的警告信息如下:

warning: Using 'getpwnam_r' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

我甚至不知道getwnam_r做了什么,但我认为它是从一些更高级别的API内部调用的。我收到gethostbyname的类似消息。

为什么不能像其他所有函数一样静态链接这些函数?

2 个答案:

答案 0 :(得分:24)

Function calls that need access to NSS or iconv need access will open other libs dynamically,因为NSS需要插件才能工作(辅助模块如pam_unix.so)。当NSS系统使这些模块崩溃时,将会有两个相互冲突的glibc版本 - 程序带来的一个版本(静态编译),以及NSS依赖项编写的dlopen()版本。狗屎会发生。

这就是为什么你不能使用getpwnam_r和一些其他函数构建静态程序。

答案 1 :(得分:-3)

AFAIK,完全静态链接应用程序并非不可能。

问题是与可能完全不同的较新库版本不兼容。比如说printf()。您可以静态链接它,但是如果将来printf()实现发生根本变化并且这个新实现不向后兼容会怎样?您的申请将被破坏。

如果我在这里错了,请有人纠正我。