1. ホーム
  2. linux

Linuxのスタティックリンクは死んだのか?

2023-10-18 11:14:54

質問

実際には -静的 フラグは現在動作していません。GNU libcのFAQから引用してみます。

2.22. 静的にリンクされたプログラムでさえ、いくつかの共有ライブラリを必要とします。 というのは、私には受け入れがたいことです。どうしたらよいでしょうか。 はどうすればよいのでしょうか?

{AJ} NSS (詳細については、`info libc "ネームサービススイッチ"'と入力してください。 は共有ライブラリなしでは正しく動作しません。 は、共有ライブラリがないと正しく動作しません。 NSSでは、異なる NIS、files、db、hesiodなど)を使うことができます。 を使うことができます。 を変更するだけで、異なるサービス(NIS、ファイル、DB、hesiod)を利用できます。 を変更するだけで、異なるサービス(NIS, files, db, hesiod)を利用できます。 唯一の欠点は 唯一の欠点は、静的 ライブラリが共有ライブラリにアクセスする必要があることです。 にアクセスする必要があることです。 これはGNU Cライブラリによって透過的に処理されます。 GNU Cライブラリによって透過的に処理されます。

解決策としては、glibcを設定する際に --を設定することです。 この場合、静的なバイナリを作成することができます。 dnsとfilesのサービスのみを使用する静的バイナリを作成することができます。 を使用する静的バイナリを作成できます (このために /etc/nsswitch.conf を変更します)。 これらのサービスに対して明示的にリンクする必要があります。 に対して明示的にリンクする必要があります。例えば

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

この方法の問題点は NSS ルーチンを使用するすべての静的プログラムを NSSルーチンを使用するすべての静的プログラムを をリンクしなければならないことです。

{UD}です。実際、このオプションでコンパイルされた libc が NSS を使っているとはもう言えません。 が NSS を使っているとは言えません。 スイッチもありません。 はもうありません。 したがって、それは 非常に 推奨 ではない を使用しないことを推奨します。 --これは、システム上のプログラムの動作に一貫性がなくなるからです。 の動作に一貫性がなくなるからです。

この事実に関して、Linux で完全に機能する静的ビルドを作成する合理的な方法はあるのでしょうか、それとも Linux では静的リンクは完全に死んでいるのでしょうか?私は、静的ビルドを意味します。

  • 動的ビルドとまったく同じように動作する 動的ビルドと全く同じように動作します (動作に一貫性のない静的 は邪道だ!)。
  • glibc 環境と Linux バージョンの妥当なバリエーションで動作します。

どのように解決するのですか?

<ブロッククオート

この事実に関して、Linux で完全に機能する静的ビルドを作成する合理的な方法はありますか、それとも Linux での静的リンクは完全に死んでいますか?

歴史的なリファレンスをどこで見つけるかわかりませんが、そうです。 静的リンク は GNU システム上では死んでいます。(私は、libc4/libc5 から libc6/glibc 2.x への移行の間に死んだと信じています)。

に照らして、この機能は無駄だと判断されました。

  • セキュリティの脆弱性。静的にリンクされたアプリケーションは、libc のアップグレードをサポートさえしません。もしアプリケーションが lib の脆弱性を含むシステム上でリンクされたなら、静的にリンクされた実行ファイル内でそれが永続することになります。

  • コードの肥大化。もし多くの静的にリンクされたアプリケーションが同じシステム上で実行されるなら、標準ライブラリは再利用されないでしょう。(試しに du -sh /usr/lib を試してみてください)。

10-15年前のLKMLとglibcのメールリストアーカイブを掘ってみてください。確かに昔、LKMLで関連するものを見たことがあります。