ランタイムライブラリ

出典: フリー百科事典『ウィキペディア(Wikipedia)』
Jump to navigation Jump to search

ランタイムライブラリ: run-time library)は、標準Cライブラリなど、コンピュータプログラムの実行時(ランタイム)にメインプログラムと常に同時に存在して利用される前提のライブラリである。詳細は環境(OSや言語や処理系)に依存する。

概要[編集]

C言語ではmain関数を実行した直後<stdio.h>に定義されたstdoutを参照すると標準出力のファイルポインターを得ることができる。また、main関数の引数を参照すればコマンドライン引数の文字列を参照することができる。これらはOSやコンパイラーが初期化しているものではなくmain関数を呼び出している関数が更に存在しその中に「スタートアップルーチン」とよばれる初期化処理と解放処理が存在しているからである。[1][2][3]また、putsといった標準ライブラリの関数は明示的なリンクなくincludeのみで使うことができる。これらスタートアップルーチンや標準関数といった言語に必要な標準的機能を提供するライブラリがランタイムライブラリである。

処理系との関係[編集]

ランタイムライブラリは通常のライブラリと異り言語機能を支える側面から処理系の一部という性格が強い。特にC++では、例外処理や、new、delete、コンストラクタ付きの静的変数といったコンパイル時のコード生成では冗長でコードが肥大化してしまう言語機能が存在し、それらの機能はランタイムライブラリーの関数に依存している。他の言語でもっと大きなものの例としてはガベージコレクションの機能などがある。[要出典]このため通常のライブラリと異なりランタイムライブラリは明示的にリンクしなくても処理系のリンカーによって自動でリンクされる。また、ランタイムライブラリーはデバッグ用など用途に応じて一つの環境に複数存在するが、処理系のリンカーはコンパイルオプションやリンクオプションに応じて適切なランタイムライブラリを選択する。[2]

必然的にリンクされるものであり、インタフェース的にも密結合であることから、(動的リンクがサポートされている環境でも)静的リンクされることも多い。同様に、ダイナミックリンクライブラリで提供されていて動的リンクする場合でも、必要に応じ逐次リンクする[要出典]のではなく、プロセスの起動時に一括リンクされることもある。

ランタイムライブラリの除去[編集]

CおよびC++には言語仕様によってOSに依存しないフリースタンディング環境が定められている。Cにおけるフリースタンディング環境では標準ライブラリとして関数が一切存在しない。また、エントリーポイントもmainである必要がなく大域変数等の初期化もいらない。Cにおけるフリースタンディング環境ではランタイムライブラリを必要としない。ただしC++についてはOSなしの環境でも最低限の言語機能を実現するためランタイムライブラリを必要とする。

ランタイムライブラリを除去する方法はフリースタンディング環境だけでなく、処理系のオプションによって強制的に実現することもできる。gccでは-nodefaultlibs

[4]を指定し、Microsoft C/C++ Optimizing Compilerでは/NODEFAULTLIBを指定する。[5]標準のランタイムライブラリを除去することにより実行ファイルを軽量化したり、TinyCRTのような第三者提供のランタイムライブラリ[6]を使用することができるようになる。特に軽量化はメガデモとよばれるデモシーンにおいて必須の技術となっている。

配布と異常終了[編集]

多くのリンカーはランタイムライブラリを静的リンクするオプションを明示的に指定しない限り、容量削減と脆弱性対策の観点から動的リンク形式のランタイムライブラリを選択する。[2] このため、プログラムを運用する計算機には配布するプログラムとは別途ランタイムライブラリが入っていなければならない。もし配布先の計算機にランタイムライブラリが入っていなければプログラムは実行直後に異常終了してしまう。異常終了に至る流れはランタイムライブラリに限らず動的リンクを使う場合全般に言えることであるが、ランタイムライブラリについては暗黙にリンクしてしまうため見逃しやすく、ことの他問題が発生しやすい。

配布先にランタイムライブラリが入っていない状況としては

  1. 配布先の計算機に入っているランタイムライブラリが古い。
  2. 配布したプログラムが開発用(デバッグ情報や性能測定用情報を含んだ)ランタイムライブラリとリンクしていた。

といったものがあり、特に2.の問題が発生しやすい。ランタイムライブラリはOSの更新や再配布可能パッケージ[7]として配布先の計算機に導入することが可能であるが、それらで導入できるランタイムライブラリは通常用のランタイムライブラリだけであり開発用のランタイムライブラリは含まれない。[2]このため誤って開発用のランタイムライブラリとリンクしたプログラムを配布すると異常終了を発生させることになる。

特に問題が発生しやすくなる要因としては下記のものがある。

  1. 開発用の計算機にコンパイラーをはじめとする開発ツールを入れると暗黙のうちに開発用のランタイムライブラリが入るため自分の計算機に開発用のランタイムライブラリを入れていると自覚しづらい。
  2. デバッグオプションの有無だけで通常用と開発用が切り替わるためどちらのライブラリを使っているか自覚しづらい。
  3. 通常のランタイムライブラリとリンクしたプログラムと開発用のランタイムライブラリとリンクしたプログラムに目に見える大きな差がない。

対策としては開発ツールが入っていない計算機上で動作確認することが大事である。

配布先の計算機に入っているランタイムライブラリが古い場合の対策としては、ランタイムライブラリを静的リンクする方法がある。確実な方法ではあるがランタイムライブラリを含むOSの脆弱性対策が発生した場合その恩恵を受けられないという欠点もある。

ランタイムライブラリの具体例[編集]

脚注[編集]

外部リンク[編集]