ランタイムライブラリランタイムライブラリ(英: run-time library)は、標準Cライブラリなど、コンピュータプログラムの実行時(ランタイム)にメインプログラムと常に同時に存在して利用される前提のライブラリである。 概要C言語では CランタイムライブラリはシステムコンポーネントとしてOSに標準搭載されていることもある。GNU CライブラリからフォークしたLinux libc、AndroidのBionic libc[4]、Microsoft Windows 10のUniversal CRTなどがある。 処理系との関係ランタイムライブラリは一般的なライブラリと異なり、言語機能を支える側面から処理系の一部という性格が強い。特にC++では、例外処理や、 必然的にリンクされるものであり、インタフェース的にも密結合であることから、(動的リンクがサポートされている環境でも)静的リンクされることも多い。同様に、ダイナミックリンクライブラリで提供されていて動的リンクする場合でも、必要に応じて遅延ロードするのではなく、プロセスの起動時に一括で早期ロードされることもある。 ランタイムライブラリの除去CおよびC++には言語仕様によってOSに依存しないフリースタンディング環境が定められている。Cにおけるフリースタンディング環境では標準ライブラリとして関数が一切存在しない。また、エントリーポイントも ランタイムライブラリを除去する方法はフリースタンディング環境だけでなく、処理系のオプションによって強制的に実現することもできる。gccでは 再配布時の注意点多くのリンカはランタイムライブラリを静的リンクするオプションを明示的に指定しない限り、容量削減と脆弱性対策の観点から既定で動的リンク形式のランタイムライブラリを選択する[8]。このため、アプリケーションプログラムを実行するコンピュータには、そのアプリケーションプログラムのモジュールとは別に動的リンク形式のランタイムライブラリのモジュールが必要となる。もし再配布先のコンピュータ(エンドユーザー環境)にランタイムライブラリが存在しなければ、プログラムは実行直後に異常終了してしまう。異常終了に至る流れはランタイムライブラリに限らず動的リンクを使う場合全般に言えることであるが、ランタイムライブラリについては暗黙にリンクしてしまうため見逃しやすく、特に問題が発生しやすい。また、もしランタイムライブラリがアプリケーションごとにプライベートでなく、システム全体で共有される場合、バージョン互換性の問題も抱えることになる(DLL地獄)。 再配布先にランタイムライブラリが存在しない状況としては、
といったものがある。 ランタイムライブラリは、同じシリーズのコンパイラでも異なるバージョン間でバイナリ互換性がないこともあり[9]、動的リンク形式のモジュールに関してはバージョンに応じた名前を付けるなどして、side-by-sideで管理されていることがある。その場合はプログラムのビルドに使用したコンパイラに対応するバージョンの共有ランタイムライブラリが必要になる。また、バイナリ互換性がない場合にモジュール境界を越えてオブジェクトをやりとりすると未定義の問題が生じる[10]。 再配布先のコンピュータにインストールされている共有ランタイムライブラリのバージョンが一致しない場合の対策としては、ランタイムライブラリを静的リンクする方法や、プライベートモジュールとしてアプリケーションのパッケージに同梱する方法がある。確実な方法ではあるが、ランタイムライブラリにセキュリティホール(脆弱性)が見つかった場合、共有ランタイムライブラリであればOSのセキュリティパッチ(脆弱性対策)によって更新される一方、ランタイムライブラリを静的リンクしたりプライベートモジュールとして再配布したりしてしまうと、その恩恵を受けられないという欠点もある。 通例、共有ランタイムライブラリは再配布可能 (redistributable) パッケージ[11]またはOSの更新プログラム[12]として再配布先のコンピュータに導入することが可能であるが、このパッケージや更新プログラムによって導入できるランタイムライブラリはエンドユーザー向け(リリースビルド用)のランタイムライブラリだけであり、開発者向け(デバッグビルド用)のランタイムライブラリは含まれない[2]。このため誤ってデバッグ用のランタイムライブラリとリンクしたプログラムを配布すると異常終了を発生させることになる。 特に問題が発生しやすくなる要因としては下記のものがある。
対策としては、開発ツールがインストールされていないコンピュータ上で必ず動作確認することが挙げられる。 脚注
関連項目 |