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

dsi*_*cha 15 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
Run Code Online (Sandbox Code Playgroud)

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

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

thi*_*ton 25

需要访问NSS或iconv的函数调用需要访问才能动态打开其他库,因为NSS需要插件才能工作(辅助模块如pam_unix.so).当NSS系统使这些模块崩溃时,将会有两个冲突版本的glibc - 你的程序带来的那个(静态编译),以及dlopen()NSS依赖的版本.狗屎会发生.

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

  • 链接器也没有硬编码列表.警告实际上来自libc.a本身.以下是它的完成方式:http://repo.or.cz/w/glibc.git/blob/HEAD:/nss/getXXbyYY.c#l155此外,它*很可能静态链接应用程序(它是只是一个警告).但是如果你不注意警告并在具有不同glibc的系统上运行应用程序,那么事情将会非常糟糕. (7认同)