我正在尝试使用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
的类似消息。
为什么不能像其他所有函数一样静态链接这些函数?
答案 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()实现发生根本变化并且这个新实现不向后兼容会怎样?您的申请将被破坏。
如果我在这里错了,请有人纠正我。