再配布時の注意点
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/02/12 10:56 UTC 版)
「ランタイムライブラリ」の記事における「再配布時の注意点」の解説
多くのリンカはランタイムライブラリを静的リンクするオプションを明示的に指定しない限り、容量削減と脆弱性対策の観点から既定で動的リンク形式のランタイムライブラリを選択する。このため、アプリケーションプログラムを実行するコンピュータには、そのアプリケーションプログラムのモジュールとは別に動的リンク形式のランタイムライブラリのモジュールが必要となる。もし再配布先のコンピュータ(エンドユーザー環境)にランタイムライブラリが存在しなければ、プログラムは実行直後に異常終了してしまう。異常終了に至る流れはランタイムライブラリに限らず動的リンクを使う場合全般に言えることであるが、ランタイムライブラリについては暗黙にリンクしてしまうため見逃しやすく、特に問題が発生しやすい。また、もしランタイムライブラリがアプリケーションごとにプライベートでなく、システム全体で共有される場合、バージョン互換性の問題も抱えることになる(DLL地獄)。 再配布先にランタイムライブラリが存在しない状況としては、 再配布先のコンピュータにインストールされている共有ランタイムライブラリのバージョンが一致しない。 再配布したプログラムが開発用の(デバッグ情報や性能測定用情報を含んだ)ランタイムライブラリとリンクしている。 といったものがある。 ランタイムライブラリは、同じシリーズのコンパイラでも異なるバージョン間でバイナリ互換性がないこともあり、動的リンク形式のモジュールに関してはバージョンに応じた名前を付けるなどして、side-by-sideで管理されていることがある。その場合はプログラムのビルドに使用したコンパイラに対応するバージョンの共有ランタイムライブラリが必要になる。また、バイナリ互換性がない場合にモジュール境界を越えてオブジェクトをやりとりすると未定義の問題が生じる。 再配布先のコンピュータにインストールされている共有ランタイムライブラリのバージョンが一致しない場合の対策としては、ランタイムライブラリを静的リンクする方法や、プライベートモジュールとしてアプリケーションのパッケージに同梱する方法がある。確実な方法ではあるが、ランタイムライブラリにセキュリティホール(脆弱性)が見つかった場合、共有ランタイムライブラリであればOSのセキュリティパッチ(脆弱性対策)によって更新される一方、ランタイムライブラリを静的リンクしたりプライベートモジュールとして再配布したりしてしまうと、その恩恵を受けられないという欠点もある。 通例、共有ランタイムライブラリは再配布可能 (redistributable) パッケージまたはOSの更新プログラムとして再配布先のコンピュータに導入することが可能であるが、このパッケージや更新プログラムによって導入できるランタイムライブラリはエンドユーザー向け(リリースビルド用)のランタイムライブラリだけであり、開発者向け(デバッグビルド用)のランタイムライブラリは含まれない。このため誤ってデバッグ用のランタイムライブラリとリンクしたプログラムを配布すると異常終了を発生させることになる。 特に問題が発生しやすくなる要因としては下記のものがある。 開発用のコンピュータに、コンパイラをはじめとする開発ツールをインストールすると、暗黙のうちにデバッグ用の共有ランタイムライブラリがインストールされるため、デバッグ用のランタイムライブラリの存在を自覚しづらい。 デバッグオプションの有無だけでリリース用とデバッグ用が切り替わるため、どちらのライブラリを使っているか自覚しづらい。 リリース用のランタイムライブラリをリンクしたプログラムと、デバッグ用のランタイムライブラリをリンクしたプログラムの間に、目に見える大きな差がない。 対策としては、開発ツールがインストールされていないコンピュータ上で必ず動作確認することが挙げられる。
※この「再配布時の注意点」の解説は、「ランタイムライブラリ」の解説の一部です。
「再配布時の注意点」を含む「ランタイムライブラリ」の記事については、「ランタイムライブラリ」の概要を参照ください。
- 再配布時の注意点のページへのリンク