16.2. 静的リンクおよび動的リンク
開発者は、完全にコンパイルされた言語でアプリケーションを構築する際に、静的リンクまたは動的リンクを使用できます。本セクションでは、Red Hat Enterprise Linux で C 言語および C++ 言語した場合の違い (特にコンテキストについて) を説明します。Red Hat は、Red Hat Enterprise Linux のアプリケーションで静的リンクを使用することは推奨していません。
静的リンクおよび動的リンクの比較
静的リンクは、作成される実行可能ファイルのライブラリーの一部になります。動的リンクは、これらのライブラリーを別々のファイルとして保持します。
動的リンクおよび静的リンクは、いくつかの点で異なります。
- リソースの使用
静的リンクにより、より多くのコードが含まれるより大きな実行可能ファイルが生成されます。ライブラリーからのこの追加コードはシステムのプログラム間で共有できないため、ランタイム時にファイルシステムの使用量とメモリーの使用量が増加します。静的にリンクされた同じプログラムを実行している複数のプロセスは依然としてコードを共有します。
一方、静的アプリケーションは、必要なランタイムの再配置も少なくなるため、起動時間が短縮します。また、必要なプライベートの RSS (homeal Set Size) メモリーも少なくなります。静的リンク用に生成されたコードは、PIC (位置独立コード) により発生するオーバーヘッドにより、動的リンクよりも効率が良くなります。
- セキュリティー
ABI 互換性を提供する動的にリンクされたライブラリーは、それらのライブラリーに依存する実行可能ファイルを変更せずに更新できます。これは、特に、Red Hat Enterprise Linux の一部として提供され、Red Hat がセキュリティー更新を提供するライブラリーで重要になります。このようなライブラリーには、静的リンクを使用しないことが強く推奨されます。
さらに、ロードアドレスのランダム化などのセキュリティー対策は、静的にリンクされた実行可能ファイルで使用することはできません。これにより、アプリケーションのセキュリティーが低下します。
- 互換性
静的リンクは、オペレーティングシステムが提供するライブラリーのバージョンに依存しない実行可能ファイルを提供しているように見えます。ただし、ほとんどのライブラリーは他のライブラリーに依存しています。静的リンクを使用すると、依存関係に柔軟性がなくなり、前方互換性と後方互換性が失われます。静的リンクは、実行可能ファイルが構築されたシステムでのみ機能します。
警告GNU C ライブラリー (glibc) からライブラリーを静的にリンクするアプリケーションでは、引き続き glibc が動的ライブラリーとしてシステムに存在する必要があります。さらに、アプリケーションのランタイム時に利用できる glibc の動的ライブラリーのバリアントは、アプリケーションのリンク時に表示されるものとビット単位で同じバージョンである必要があります。したがって、静的リンクは、実行可能ファイルが構築されたシステムでのみ機能することが保証されます。
- サポート範囲
- Red Hat が提供するほとんどの静的ライブラリーは Optional チャンネルにあり、Red Hat ではサポートされていません。
- 機能
いくつかのライブラリー (特に GNU C ライブラリー (glibc)) は、静的にリンクすると提供する機能が少なくなります。
たとえば、静的にリンクすると、glibc はスレッドや、同じプログラム内の
dlopen()
関数に対する呼び出しの形式をサポートしません。
上述の不利な点により、静的リンクは、特にアプリケーション全体、glibc ライブラリー、および libstdc++ ライブラリーに対しては、使用しないようにする必要があります。
compat-glibc パッケージは Red Hat Enterprise Linux 7 に含まれますが、ランタイムパッケージではないため、何も実行する必要がありません。これは、リンク用のヘッダーファイルとダミーのライブラリーが含まれる開発パッケージでしかありません。これにより、以前の Red Hat Enterprise Linux バージョンで実行するパッケージのコンパイルおよびリンクが可能になります (ヘッダーやライブラリーに compat-gcc-\* を使用)。このパッケージの使用の詳細については、rpm -qpi compat-glibc-*
を実行します。
静的リンクを使用する理由
以下のようなケースでは、静的リンクは妥当なオプションとして選択できます。
- 動的リンクが使用できないライブラリー
-
空の chroot 環境またはコンテナーでコードを実行するには、完全に静的なリンクが必要です。ただし、
glibc-static
パッケージを使用した静的リンクは、Red Hat ではサポートされません。