Почему невозможно полностью статически связать приложение?
Я пытаюсь скомпилировать статически связанную двоичную копию с 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
.
Почему бы не было возможности просто статически связать эти функции, как и любую другую функцию?
Ответы
Ответ 1
Функциональные вызовы, которым нужен доступ к NSS или доступ к iconv, будут динамически открывать другие библиотеки, поскольку NSS нужны плагины для работы (вспомогательные модули, такие как pam_unix.so). Когда система NSS расширяет эти модули, будет существовать две конфликтующие версии glibc - одна из них, с которой была сгенерирована ваша программа (статически скомпилирована), и одна dlopen()
с помощью зависимостей NSS. Дерьмо будет.
Вот почему вы не можете создавать статические программы, используя getpwnam_r и несколько других функций.
Ответ 2
AFAIK, невозможно полностью статически связать приложение.
Проблема будет несовместима с новыми версиями библиотек, которые могут быть совершенно разными. Скажем, например, printf(). Вы можете статически связать его, но что если в будущем реализация printf() радикально изменится, и эта новая реализация не будет обратной совместимости? Ваше приложение будет сломано.
Пожалуйста, поправьте меня, если я ошибаюсь.