Статическое подключение Linux мертво?

На самом деле - статический флаг gcc на Linux не работает теперь. Позвольте мне процитировать из GNU libc FAQ:

2.22. Даже для статически связанных программ нужны некоторые общие библиотеки, который не приемлем для меня. Что я могу сделать?

{AJ} NSS (для деталей просто вводят 'информацию libc "служба имен Переключатель"') не будет работать правильно без общих библиотек. NSS позволяет использовать различные сервисы (например, NIS, файлы, дб, hesiod), просто изменив один конфигурационный файл (/etc/nsswitch.conf), не повторно связывая программ. Единственный недостаток - то, что теперь статические библиотеки должны получить доступ к совместно использованным библиотекам. Это обрабатывается прозрачно библиотекой GNU C.

Решение состоит в том, чтобы настроить glibc с - enable-static-nss. В этом случае можно создать статический двоичный файл, который будет использовать только сервисы DNS, и файлы (измените/etc/nsswitch.conf для этого). Необходимо связаться явно против всех этих сервисов. Например:

 gcc -static test-netdb.c -o test-netdb \
   -Wl,--start-group -lc -lnss_files -lnss_dns -lresolv -Wl,--end-group

Проблема с этим подходом состоит в том, что необходимо связать каждую статическую программу, которая использует стандартные программы NSS со всеми теми библиотеками.
{UD} На самом деле, нельзя больше говорить, что libc, скомпилированный с этой опцией, использует NSS. Больше нет никакого переключателя. Поэтому это настоятельно рекомендовано для не использования - enable-static-nss, так как это делает поведение программ в системе непоследовательным.

Касающийся, что факт является там каким-либо разумным путем теперь для создания полно функционирующей статической сборки на Linux или статическом подключении, абсолютно мертво на Linux? Я имею в виду статическую сборку который:

  • Ведет себя точно тот же путь, как динамическая сборка делает (статичный-nss с непоследовательным поведением, является злым!);
  • Работы над разумными изменениями glibc среды и версий Linux;
61
задан Shcheklein 7 August 2010 в 12:24
поделиться

2 ответа

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

Я не знаю, где это сделать. найдите исторические ссылки, но да, статическая компоновка не работает в системах GNU. (Я считаю, что он умер при переходе с libc4 / libc5 на libc6 / glibc 2.x.)

Эта функция была признана бесполезной в свете:

  • уязвимостей системы безопасности. Приложение, которое было статически связано, даже не поддерживает обновление libc. Если приложение было связано с системой, содержащей уязвимость библиотеки, то оно будет сохранено в статически связанном исполняемом файле.

  • Раздутие кода. Если в одной системе запускается много статически связанных приложений, стандартные библиотеки не будут использоваться повторно, поскольку каждое приложение содержит внутри свою собственную копию всего. (Попробуйте du -sh / usr / lib , чтобы понять масштаб проблемы.)

Попробуйте покопаться в архивах списков рассылки LKML и glibc 10-15 лет назад. Я почти уверен, что давно видел что-то связанное с LKML.

26
ответ дан 24 November 2019 в 17:13
поделиться

Тот факт, что вам нужно динамически связываться со службой NSS, не означает, что вы не можете статически связываться с какой-либо другой библиотекой. Все, что говорится в FAQ, это то, что даже «статически» связанные программы имеют некоторые динамически подключаемые библиотеки. Это не говорит о том, что статическое связывание «невозможно» или что оно «не работает».

13
ответ дан 24 November 2019 в 17:13
поделиться