Фактически, флаг -static gcc в Linux сейчас не работает. Приведу цитату из FAQ по GNU libc:
2.22. Даже статически скомпонованные программы нуждаются в некоторых разделяемых библиотеках, что для меня неприемлемо. Что я могу сделать?
{AJ} NSS (для получения подробной информации просто введите `info libc" Name Service Switch ") не будет работать должным образом без разделяемых библиотек. NSS позволяет использовать различные службы (например, NIS, files, db, 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, скомпилированная с этой опцией, использует НСС. Переключателя больше нет. Поэтому настоятельно рекомендуется не использовать --enable-static-nss, поскольку это делает поведение программ в системе несовместимым.
Что касается этого факта, есть ли какой-нибудь разумный способ создать полнофункциональную статическую сборку в Linux или статическая компоновка полностью мертва в Linux? Я имею в виду статическую сборку, которая:
- Ведет себя точно так же, как и динамическая сборка (static-nss с непоследовательным поведением - зло!);
- Работает на разумных вариациях среды glibc и версий Linux;