DLL地獄(ディーエルエルじごく)
DLL地獄とは、動的にリンクされた
ライブラリに依存するアプリケーションが、最新のDLLやCOMコンポーネントのバージョンアップによって動作しなくなる現象を指します。この現象は、特にWindows環境で多く発生するため、一般的に「DLL HELL」と呼ばれます。また、Windows以外の
オペレーティングシステム(OS)での依存関係の問題に対しては、「Dependency Hell」という用語が使われます。
概要
DLL地獄は、
動的リンクライブラリを使用するOS全てにおいて、この現象が発生するリスクがあります。特に従来のWindowsでは、プログラムの設計ミスやインストーラのエラーによってこの問題が発生することが多いです。Microsoftは厳格なバージョン管理規則を定めていますが、一部の開発者がこの管理方法を理解せずに前のバージョンをエンドユーザーにインストールさせることが多々あります。近年では、システム保護機能やサイドバイサイド(Side-by-Side, SxS)機能の強化によりこの問題は軽減されていますが、根本的な解決には至っていません。
Linux環境では、異なるディストリビューション間での
ライブラリの不一致や、サードパーティの
パッケージ管理システムを使用することで、依存関係の破損が原因で同様の問題が発生することがあります。
発生の原因
この現象が発生する主な理由は、共有
ライブラリに対して互換性を損なうような改変が行われた際、プログラムは新旧バージョンを識別できずに動作できなくなる点にあります。保守や可読性の向上、セキュリティの向上などが理由で行われた仕様変更が、旧バージョンとの互換性を崩すことになります。特にOSに組み込まれる
ライブラリで変更があった場合、その影響範囲は広範囲に及ぶ可能性が高いです。
また、ソフトウェアインストーラがシステムの共有
ライブラリのバージョンを確認せずに古いバージョンを上書きすることで、DLL地獄が引き起こされることが少なくありません。サードパーティのアプリケーションでは、
ライブラリをアプリケーションの
ディレクトリに同梱することでこの問題を回避しようとしますが、同名の
ライブラリが複数存在した場合、OSの設定によってどちらが優先されるかが変わり、意図しない
ライブラリが使用されることもあります。
この問題に対処するため、Windows 2000のサービスパック4以降では、
ライブラリの検索順序が変更され、PATHの設定が優先されなくなりました。Microsoftは、
.NET Frameworkを通じて異なるバージョンの同一
ライブラリを同時にインストールできる機能を提供し、ユーザーが使用したい
ライブラリを指定できるようにしています。
Linuxや
UNIXでは、共有
ライブラリ名にバージョン番号を含めることで、バージョンごとの問題が発生することなく運用されています。しかし、バージョン番号に現れない変更や同じ
ライブラリの異なるバージョンが同時に必要になると、問題が再発する可能性があります。
対処方法
Windows MEやWindows XP以降のOSでは、万が一システムフォルダ内の
ライブラリファイルを誤って変更してしまった場合でも、「
システムの復元」機能を活用すれば大抵の問題を修復できます。また、他のOSや「
システムの復元」が無効な場合でも、システムのスナップショットやイメージバックアップからのリストアが可能です。
これらの方法が利用できない場合は、問題を起こしたソフトウェアのアンインストールや
ライブラリの再インストールを行うことも考えられますが、必ずしも成功するとは限らず、逆に悪化する場合もあります。そのため、使用後にはシステムを整えてからOSの修復やリカバリを行った方が良いでしょう。
Linux環境では、コンテナ仮想化が広まり、アプリケーションの提供者が動作確認済みの
ライブラリや設定ファイルをコンテナに収めて配布する方法も選ばれるようになっています。この手法は
Dockerなどで広まっており、環境依存の問題を軽減することが期待されています。
関連項目
脚注
詳しくは関連資料をご確認ください。