ランタイム
ライブラリとは、プログラムが実行される際に、メインプログラムと常に同時に存在し、利用されることを前提とした
ライブラリのことです。標準C
ライブラリなどが代表例として挙げられます。
概要
C言語を例に挙げると、`main`関数が実行されると、標準出力へのアクセスやコマンドライン引数の取得が可能になります。これはOSや
コンパイラが直接初期化しているのではなく、`main`関数を呼び出す関数内に存在する「スタートアップルーチン」と呼ばれる初期化処理によるものです。また、`puts`などの標準
ライブラリ関数はランタイム
ライブラリに実装されており、ヘッダーをインクルードするだけで利用できます。このように、言語に必要な標準的な機能を提供する
ライブラリがランタイム
ライブラリです。
Cランタイム
ライブラリは、OSに標準搭載されていることもあり、
Linuxの`libc`、Androidの`Bionic libc`、Windowsの`Universal CRT`などがその例です。
処理系との関係
ランタイム
ライブラリは、単なる
ライブラリというよりも、言語機能を支える処理系の一部としての側面が強く、特に
C++では例外処理や`new`/`delete`、静的変数の初期化などがランタイム
ライブラリに依存しています。これらの機能は、コンパイル時にすべてのコードを生成すると冗長になるため、ランタイム
ライブラリの関数として共通化されています。ガベージコレクションなども、より大きな例として挙げられます。そのため、ランタイム
ライブラリは明示的にリンクを指定しなくても、リンカによって自動的にリンクされます。
また、ランタイム
ライブラリはデバッグ用とリリース用など、用途に応じて複数のものが存在しますが、リンカはコンパイルオプションに応じて適切な
ライブラリを選択します。
インターフェース的にも密結合であるため、静的リンクされることが多いですが、動的リンクの場合でも、遅延ロードではなくプロセスの起動時に一括でロードされることもあります。
Cおよび
C++には、OSに依存しない
フリースタンディング環境というものが定義されており、Cの
フリースタンディング環境では、標準
ライブラリ関数は一切存在しません。また、エントリーポイントも`main`である必要はなく、
グローバル変数の初期化も不要です。このような環境では、ランタイム
ライブラリは必要ありません。ただし、
C++はOSなしの環境でも最低限の言語機能を実現するため、ランタイム
ライブラリが必要となります。
ランタイム
ライブラリは、
フリースタンディング環境だけでなく、
コンパイラのオプションによって強制的に除去することもできます。例えば、gccでは`-nodefaultlibs`、Visual
C++では`/NODEFAULTLIB`を指定することで、標準のランタイム
ライブラリを除去できます。これにより、実行ファイルの軽量化や、`TinyCRT`のような第三者提供のランタイム
ライブラリの使用が可能になります。特に軽量化は、デモシーンで重要な技術となっています。
再配布時の注意点
多くのリンカは、ランタイム
ライブラリを動的リンク形式で選択します。これは容量削減と脆弱性対策の観点から好ましいのですが、プログラムを実行する
コンピュータに、対応するランタイム
ライブラリが存在しないと、プログラムは異常終了してしまいます。
再配布先でランタイム
ライブラリが存在しない状況としては、以下のようなものが挙げられます。
再配布先のコンピュータにインストールされている共有ランタイムライブラリのバージョンが一致しない。
再配布したプログラムが、開発用のランタイム
ライブラリとリンクしている。
ランタイム
ライブラリは、同じ
コンパイラシリーズでもバージョン間でバイナリ互換性がないことがあり、動的リンクモジュールはバージョンに応じて名前を付けて管理されていることがあります。そのため、プログラムをビルドした
コンパイラに対応するバージョンの共有ランタイム
ライブラリが必要になります。
バージョン不一致への対策としては、ランタイム
ライブラリを静的リンクするか、プライベートモジュールとして同梱する方法があります。ただし、静的リンクや同梱は、セキュリティパッチの恩恵を受けられないという欠点もあります。
共有ランタイム
ライブラリは、再配布可能パッケージやOSの更新プログラムとして導入できますが、これらはエンドユーザー向け(リリースビルド用)のランタイム
ライブラリのみで、開発者向け(デバッグビルド用)のランタイム
ライブラリは含まれていません。デバッグ用とリンクしたプログラムを配布すると、異常終了を引き起こす可能性があります。
特に問題が発生しやすい要因としては、以下が挙げられます。
開発環境ではデバッグ用のランタイムライブラリが暗黙的にインストールされるため、その存在を意識しにくい。
デバッグオプションの有無だけで
ライブラリが切り替わるため、どちらの
ライブラリを使っているか自覚しにくい。
リリース用とデバッグ用で見た目に大きな違いがない。
これらの問題への対策として、開発ツールがインストールされていない環境で動作確認を行うことが重要です。
まとめ
ランタイムライブラリは、プログラムの実行に不可欠な要素であり、開発者はその役割と特性を理解しておく必要があります。特に再配布時には、適切なランタイムライブラリを選択し、トラブルを避けるための注意が必要です。
脚注
動作環境
*
ライブラリ