На самом деле, -статический флаг gcc в Linux теперь не работает. Позвольте мне привести из часто задаваемых вопросов GNU libc:
2,22. Даже статически связанные программы нуждаются в некоторых общих библиотеках что неприемлемо для меня. Какие я могу сделать?
{AJ} NSS (для подробностей просто введите `info libc "Name Service Switch" ") не будет работать без общих библиотеки. NSS позволяет использовать разные услуги (например, NIS, файлы, db, hesiod) просто изменив одну конфигурацию файла (/etc/nsswitch.conf) без переворачивание любых программ. Единственный Недостатком является то, что теперь статическое библиотекам необходимо получить доступ к общим библиотеки. Это обрабатывается прозрачно библиотекой GNU C.
Решение состоит в настройке glibc с --enable-статическому 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? Я имею в виду статическую сборку, которая:
- Ведет себя точно так же, как и dynamic build do (static-nss с непоследовательное поведение - зло!);
- Работает с разумными вариантами среды glibc и версиями Linux;