Почему невозможно полностью статически связать приложение? - PullRequest
14 голосов
/ 15 ноября 2011

Я пытаюсь скомпилировать статически связанный двоичный файл с помощью 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 ]

24 голосов
/ 15 ноября 2011

Вызовы функций, которым нужен доступ к NSS или iconv, которым нужен доступ, будут динамически открывать другие библиотеки , поскольку NSS для работы нужны плагины (вспомогательные модули, такие как pam_unix.so)Когда система NSS отключит эти модули, появятся две конфликтующие версии glibc - одна, которую ваша программа принесла с собой (статически скомпилированная в), и одна dlopen(), созданная зависимостями NSS.Дерьмо случится.

Вот почему вы не можете создавать статические программы, используя getpwnam_r и некоторые другие функции.

0 голосов
/ 15 ноября 2011

AFAIK, невозможно полностью статически связать приложение.

Проблема заключается в несовместимости с более новыми версиями библиотеки, которые могут быть совершенно другими.Скажем, например, printf ().Вы можете статически связать его, но что если в будущем реализация printf () радикально изменится и эта новая реализация не будет обратно совместима?Ваша заявка будет нарушена.

Пожалуйста, кто-нибудь исправит меня, если я здесь не прав.

...