オブジェクトファイル
オブジェクトファイルとは、通常は直接実行できない再配置可能形式のマシンコードを意味するオブジェクトコードを含むファイルです。オブジェクトファイルにはさまざまな形式があり、同じオブジェクトコードを異なるオブジェクトファイルにパッケージ化できます。 オブジェクトファイルは共有ライブラリのように機能する場合もあります。
オブジェクトコード自体に加えて、オブジェクトファイルには、リンクまたはデバッグに使用されるメタデータが含まれる場合があります。これには、異なるモジュール間のシンボリック相互参照を解決するための情報、再配置情報、スタック巻き戻し情報、コメント、プログラムシンボル、デバッグまたはプロファイリング情報が含まれます。
オブジェクトファイル形式
オブジェクトファイル形式は、オブジェクトコードと関連データの保存に使用されるコンピューターファイル形式です。
多くの異なるオブジェクトファイル形式があります。もともと各タイプのコンピューターには独自のフォーマットがありましたが、Unixやその他のポータブルオペレーティングシステムの出現により、COFFやELFなどのいくつかのフォーマットがさまざまな種類のシステムで定義および使用されています。同じファイル形式をリンカーの入力と出力の両方として、したがってライブラリーと実行可能ファイル形式として使用することができます。:p.16
オブジェクトファイル形式の設計および/または選択は、システム設計全体の重要な部分です。これはリンカーのパフォーマンスに影響を与えるため、開発中のプログラマーのターンアラウンドに影響します。この形式が実行可能ファイルに使用される場合、設計はプログラムの実行開始にかかる時間にも影響し、したがってユーザーに対する応答性にも影響します。
セグメンテーション
ほとんどのオブジェクトファイル形式は、データの個別のセクションとして構造化され、各セクションには特定のタイプのデータが含まれます。これらのセクションは、以前はメモリ管理の一般的な形式であった「メモリセグメント」という用語により、「セグメント」として知られています。ローダーによってプログラムがメモリに読み込まれると、ローダーはメモリのさまざまな領域をプログラムに割り当てます。これらの領域の一部はオブジェクトファイルのセグメントに対応するため、通常は同じ名前で知られています。スタックなどのその他のものは、実行時にのみ存在します。場合によっては、実際のメモリアドレスを指定するためにローダー(またはリンカー)によって再配置が行われます。ただし、多くのプログラムまたはアーキテクチャでは、メモリ管理ユニットまたは位置に依存しないコードによって処理されるため、再配置は必要ありません。一部のシステムでは、オブジェクトファイルのセグメントをメモリにコピー(ページング)して、さらに処理することなく実行できます。これらのシステムでは、これは遅延して実行される場合があります。つまり、実行中にセグメントが参照される場合のみです。たとえば、オブジェクトファイルによってバッキングされたメモリマップファイルを使用します。
典型的なオブジェクトファイル形式でサポートされるデータの種類:
- ヘッダー(説明および制御情報)
- コードセグメント(「テキストセグメント」、実行可能コード)
- データセグメント(初期化された静的変数)
- 読み取り専用データセグメント( rodata、初期化された静的定数)
- BSSセグメント(初期化されていない静的データ、変数と定数の両方)
- 外部定義とリンクの参照
- 移転情報
- 動的リンク情報
- デバッグ情報
異なるオブジェクトファイル内のセグメントは、セグメントの定義時に指定された規則に従って、リンカによって結合されます。オブジェクトファイル間で共有されるセグメントには規則があります。たとえば、DOSには、特別なセグメントの名前と、それらを結合できるかどうかを指定するさまざまなメモリモデルがあります。
デバッグ情報は、COFFのようにオブジェクトファイル形式の不可欠な部分であるか、スタブやDWARFなどのいくつかのオブジェクト形式で使用される半独立形式のいずれかです。
GNUプロジェクトのバイナリファイル記述子ライブラリ(BFDライブラリ)は、さまざまな形式のオブジェクトファイルを操作するための共通APIを提供します。