Search code examples
linuxlinkerstatic-linking

Why would it be impossible to fully statically link an application?


I'm trying to compile a statically linked binary with GCC and I'm getting warning messages like:

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

I don't even know what getwnam_r does, but I assume it's getting called from inside some higher level API. I receive a similar message for gethostbyname.

Why would it not be possible to just statically link these functions in like every other function?


Solution

  • Function calls that need access to NSS or iconv need access will open other libs dynamically, since NSS needs plugins to work (the helper modules like pam_unix.so). When the NSS system dlopens these modules, there will be two conflicting versions of glibc - the one your program brought with it (statically compiled in), and the one dlopen()ed by NSS dependencies. Shit will happen.

    This is why you can't build static programs using getpwnam_r and a few other functions.