== 概要 ==
[[C言語]]ではmain関数を実行した直後<stdio.h>に定義されたstdoutを参照すると標準出力のファイルポインターを得ることができる。また、main関数の引数を参照すればコマンドライン引数の文字列を参照することができる。これらはOSやコンパイラーが初期化しているものではなくmain関数を呼び出している関数が更に存在しその中に「スタートアップルーチン」とよばれる初期化処理と解放処理が存在しているからである。<ref>https://msdn.microsoft.com/ja-jp/library/f9t8842e.aspx</ref><ref name=":0">https://msdn.microsoft.com/ja-jp/library/abx4dbyh.aspx</ref><ref>典型的なスタートアップルーチンとしては <code>crt0</code>がある(詳細は [[:en:Crt0]])</ref>また、putsといった標準ライブラリの関数は明示的なリンクなくincludeのみで使うことができる。これらスタートアップルーチンや標準関数といった言語に必要な標準的機能を提供するライブラリがランタイムライブラリである。
== 処理系との関係 ==
ランタイムライブラリは通常のライブラリと異り言語機能を支える側面から処理系の一部という性格が強い。特に[[C++]]では、例外処理や、new、delete、コンストラクタ付きの静的変数といったコンパイル時のコード生成では冗長でコードが肥大化してしまう言語機能が存在し、それらの機能はランタイムライブラリーの関数に依存している。他の言語でもっと大きなものの例としては[[ガベージコレクション]]の機能などがある。{{要出典|date=2018年1月}}このため通常のライブラリと異なりランタイムライブラリは明示的にリンクしなくても処理系の[[リンケージエディタ|リンカー]]によって自動でリンクされる。また、ランタイムライブラリーはデバッグ用など用途に応じて一つの環境に複数存在するが、処理系のリンカーはコンパイルオプションやリンクオプションに応じて適切なランタイムライブラリを選択する。<ref name=":0" />
必然的にリンクされるものであり、インタフェース的にも密結合であることから、([[動的リンク]]がサポートされている環境でも)[[静的リンク]]されることも多い。同様に、[[ダイナミックリンクライブラリ]]で提供されていて動的リンクする場合でも、必要に応じ逐次リンクする{{要出典|date=2018年1月}}のではなく、プロセスの起動時に一括リンクされることもある。
== 配布と異常終了 ==
多くのリンカーはランタイムライブラリを静的リンクするオプションを明示的に指定しない限り、容量削減と脆弱性対策の観点から動的リンク形式のランタイムライブラリを選択する。<ref name=":0" /> このため、プログラムを運用する計算機には配布するプログラムとは別途ランタイムライブラリが入っていなければならない。もし配布先の計算機にランタイムライブラリが入っていなければプログラムは実行直後に異常終了してしまう。異常終了に至る流れはランタイムライブラリに限らず動的リンクを使う場合全般に言えることであるが、ランタイムライブラリについては暗黙にリンクしてしまうため見逃しやすく、ことの他問題が発生しやすい。
配布先にランタイムライブラリが入っていない状況としては
特に問題が発生しやすくなる要因としては下記のものがある。
# 開発用の計算機にコンパイラーをはじめとする開発ツールを入れると暗黙のうちに開発用のランタイムライブラリが入るため自分の計算機に開発用のランタイムライブラリを入れていると自覚しづらい。
# デバッグオプションの有無だけで通常用と開発用が切り替わるためどちらのライブラリを使っているか自覚しづらい。
# 通常のランタイムライブラリとリンクしたプログラムと開発用のランタイムライブラリとリンクしたプログラムに目に見える大きな差がない。
|