実際、 Linux の-static gcc フラグは現在機能しません。GNU libc FAQ から引用させてください。
2.22. 静的にリンクされたプログラムでさえ、私には受け入れられない共有ライブラリが必要です。私に何ができる?
{AJ} NSS (詳細については、「info libc "Name Service Switch"」と入力してください) は、共有ライブラリがないと正しく動作しません。NSS では、プログラムを再リンクすることなく、1 つの構成ファイル (/etc/nsswitch.conf) を変更するだけで、さまざまなサービス (NIS、ファイル、db、hesiod など) を使用できます。唯一の欠点は、静的ライブラリが共有ライブラリにアクセスする必要があることです。これは、GNU C ライブラリによって透過的に処理されます。
解決策は、--enable-static-nss を使用して glibc を構成することです。この場合、サービスの 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で完全に機能しませんか? 私は静的ビルドを意味します:
- 動的ビルドとまったく同じように動作します (動作に一貫性のない static-nss は悪です!)。
- glibc 環境と Linux バージョンの合理的なバリエーションで動作します。