Подтвердить что ты не робот

Почему невозможно полностью статически связать приложение?

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

Почему бы не было возможности просто статически связать эти функции, как и любую другую функцию?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Пожалуйста, поправьте меня, если я ошибаюсь.