リロケータブルバイナリ

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

()

0


セグメント[編集]

オブジェクトファイルは、ヘッダー情報、コードセグメント、データセグメント、読み取り専用データセグメント、VSSセグメントなど多くのメモリセグメント種別に分けられる。リロケーション情報もメモリセグメントの1つである。

リロケーション情報[編集]

オブジェクトファイル内のリロケーション情報とは、各セクションをメモリに配置する際の先頭アドレスとセクションサイズを意味する。テキストやデータなどのセクションはファイル内に実体があり、ファイルの先頭からのオフセット(をページサイズで割った余り)とメモリ上に配置する際のアドレスのページ内オフセットが一致するように配置される。BSSは初期値を持たないグローバル変数域であり、ファイル内に実体がない。

ダイナミックリンクライブラリを使用する実行ファイルでは未解決シンボルに関するシンボルテーブル状のデータをリロケーション情報として持っていて、実行時にローダーがリロケーションを行う。

リロケーションの手法[編集]

リンカがオブジェクトファイル内のセグメント情報とリロケーションテーブルを読み込み以下のようにリロケーションを実施する。

  1. 各オブジェクトファイルにはテキスト、データ、BSS といったセクションが存在する。全オブジェクトファイルをひとつの実行ファイルにまとめる際にそれらセクションを種類ごとにまとめるように配置する。そして、各セクションの配置アドレスを決定する。これによって各シンボルのアドレスが決定される。この時点で各シンボル(関数名や変数名)はユニークな実行時アドレスが割り当てられる。
  2. 各セクションでシンボルを参照している箇所を修正して正しい実行時アドレスを参照するようにする。


関連項目[編集]