Skip to content

オブジェクトモジュールフォーマット

oraccha edited this page Jan 15, 2013 · 1 revision

オブジェクトフォーマット,オブジェクトファイルフォーマット

C 言語で言えば一つのソースコード(.c)のことをコンパイル単位と呼ぶ.Unix などの実行環境ではコンパイル単位をコンパイルするとオブジェクト(.o)と呼ばれる形式のファイルが生成される.この中にはテキストセグメント,データセグメント,bss セグメント,シンボルテーブルなどが含まれる(ここでは「セグメント = セクション」.Unix では歴史的にセグメントと呼ぶが,x86のセグメンテーションとは関係ない.ELF では両者を区別している). そして複数のオブジェクトファイル(リンク可能ファイル),共有ライブラリをリンクすることで実行可能ファイル(a.out)が生成される.

  • (以前後輩に聞かれて意外と知らないんだなと思ったんだけど)gcc の -r オプションは入力として与えられたオブジェクトファイルをリンクして,リンク可能なオブジェクトファイルを作成するので,出力ファイルに再配置情報とシンボルテーブルを出力している.

V4 ではリンク可能ファイル,実行可能ファイル,共有ライブラリを区別せず,すべてをオブジェクトモジュールと呼ばれる同一の形式で表現している. コンパイル単位に含まれる要素も異なり,下図に示すようにコードセグメント,外部変数セグメント,内部静的データセグメント,リンケージテーブルセグメント,名前セグメントから構成される(実装でもセグメンテーションを利用している). また,タスクとして実行される場合は,実行時にスタックセグメントが追加される.

さらに内部静的データ,リンケージテーブルをコンパイル単位で切り替えることができるので,実行コンテキストによってコンパイル単位ごとに異なるインスタンスを利用することが可能になる.

  • ELF では COW(Copy On Write) を利用して,プロセスごとのデータ領域を用意している.
  • 共有ライブラリのために MVS のリンクパック領域や Lavender のレジデントアドレス空間のような共有領域を使う方法があるが,上記のようなインスタンスを持つことはできない(と思う).
  • そもそも V4 は SASOS なわけだが.

[img:http://tiki.is.os-omicron.org/files/v4/context.png コンパイル単位とセグメント]


一般的なフォーマット


Clone this wiki locally