静的再配置 (セイテキサイハイチ) とは | 意味や読み方など丁寧でわかりやすい用語解説
静的再配置 (セイテキサイハイチ) の読み方
日本語表記
静的再配置 (セイテキサイハイチ)
英語表記
Static Relocation (スタティックリロケーション)
静的再配置 (セイテキサイハイチ) の意味や用語解説
静的再配置とは、プログラムのソースコードがコンパイルされ、最終的な実行ファイルが生成される過程の、リンクと呼ばれる段階で行われるアドレス解決処理の一種である。プログラムは通常、複数のソースファイルから成り立っており、それぞれが個別にコンパイルされてオブジェクトファイルとなる。この時点では、各オブジェクトファイルは、自身がメモリ空間のどの位置に配置されるかを知らない。そのため、他のファイルで定義された関数を呼び出したり、変数を参照したりする箇所のアドレスは未確定のままである。静的再配置は、リンカがこれらのオブジェクトファイルを一つに結合する際に、プログラムがメモリにロードされる特定のアドレスを想定し、それに基づいて未確定だったアドレス参照をすべて具体的な値に書き換える作業を指す。この処理はプログラムの実行前に静的に完了するため、実行時のオーバーヘッドがないという特徴を持つ。 プログラム開発の現場では、機能のモジュール化やコードの再利用性を高めるために、ソースコードを複数のファイルに分割するのが一般的である。例えば、メインの処理フローを記述するファイル、数学的な計算を行う関数群をまとめたファイル、ファイル入出力を担当するファイルといった具合に分割される。これらのソースファイルはコンパイラによってそれぞれ独立して機械語に翻訳され、オブジェクトファイルが生成される。しかし、この段階では各オブジェクトファイルは自己完結しておらず、互いに依存関係を持っている。例えば、メイン処理のオブジェクトファイルが計算用オブジェクトファイル内の関数を呼び出すコードを含んでいても、コンパイル時点ではその関数の具体的なメモリアドレスは不明である。このままでは、CPUはどこにジャンプすれば良いかわからず、プログラムとして成立しない。 この問題を解決するのがリンカの役割であり、静的再配置はその中核をなす処理である。リンカは、複数のオブジェクトファイルと必要なライブラリファイルを入力として受け取り、それらを結合して単一の実行ファイルを生成する。この過程で、まずリンカは各オブジェクトファイルに含まれるコードやデータを、最終的な実行ファイル内のどこに配置するかを決定する。次に、各オブジェクトファイルが外部に公開している関数名や変数名、すなわち「シンボル」の情報を集め、どのシンボルがどのメモリアドレスに対応するかを解決する。このシンボル解決が完了すると、プログラム全体のアドレス空間が確定する。そして、リンカは各オブジェクトファイルに含まれる「再配置情報」を元に、実際の再配置処理を行う。再配置情報とは、コンパイラがオブジェクトファイル内に残したメモ書きのようなもので、「この場所には、シンボル`xxx`のアドレスを埋め込む必要がある」といった指示が記録されている。リンカはこの指示に従い、先ほど解決したシンボルのアドレスを、コード中の未解決だった箇所に正確に書き込んでいく。この処理を経て、すべての内部参照が解決された、実行可能なファイルが完成する。 静的再配置の最大の利点は、実行時性能に優れている点である。アドレス解決に関するすべての計算がプログラムの実行前に完了しているため、プログラムの起動時に余計な処理を必要とせず、高速な起動が可能となる。また、実行中にアドレスを動的に解決することもないため、処理性能への影響がない。この特性から、メモリ配置が固定的であり、かつリアルタイム性など実行時性能が厳しく求められる組み込みシステムや、オペレーティングシステムのカーネルといった基盤的なソフトウェアにおいて、静的再配置は依然として重要な技術である。しかし、静的再配置には柔軟性に欠けるという側面もある。生成された実行ファイルは、リンク時に想定された特定のアドレスにロードされることを前提とするため、異なるプログラムが同じアドレス空間を要求した場合に問題が生じる可能性がある。また、利用しているライブラリが更新された際には、そのライブラリを利用しているすべてのアプリケーションを再リンクする必要があり、メンテナンス性に課題があった。これらの課題を解決するために、アドレス解決を実行時に行う動的再配置や動的リンクという技術が登場し、現代の多くのOSではそちらが主流となっている。それでも、プログラムがどのようにして機械語の断片から実行可能な形式に組み上げられるのかという根本的な仕組みを理解する上で、静的再配置の知識はシステムエンジニアにとって不可欠である。