Cのオブジェクトファイルとは


140

Cのライブラリについて読んでいますが、オブジェクトファイルの説明はまだわかりません。他のコンパイル済みファイルとオブジェクトファイルの実際の違いは何ですか?
誰かが人間の言語で説明できたらうれしいです。



回答:


153

オブジェクトファイルは、コンパイルフェーズからの実際の出力です。これはほとんどがマシンコードですが、リンカがその中にあるシンボルと、機能するために必要なシンボルを確認できるようにする情報があります。(参考までに、「シンボル」は基本的にグローバルオブジェクト、関数などの名前です)

リンカーはこれらすべてのオブジェクトファイルを受け取り、それらを結合して1つの実行可能ファイルを作成します(可能な場合、つまり、重複または未定義のシンボルがないことを前提とします)。コマンドラインオプションを使用して「コンパイルするだけ」と指示しないと、多くのコンパイラーがこれを行います(読み取り:リンカーは自分で実行します)。(-c一般的な「コンパイルするだけです。リンクしない」オプションです。)


実際、ほとんどのコンパイラでは、コンパイルフェーズからの出力はアセンブリコードであり、コンパイラはアセンブラを呼び出してそれをオブジェクトファイルに変換します。
Chris Dodd 2013

15
@ChrisDodd:古いコンパイラの場合はよくありました。最近では、コンパイラは要求しない限りアセンブリコードを生成せず、多くの場合内部で使用しません。しかし、どちらにしても、アセンブリはコンパイルフェーズのサブフェーズになるので、それだけで問題はありません。
cHao 2013

2
単一のオブジェクトファイルを実行できますか?
ハニー

1
@ハニー:通常、いいえ。オブジェクトファイルが実行用に設計された形式(基本的にはそうではない)であったとしても、「機能するために必要なシンボル」に関する部分は基本的に取り決めを無効にします。標準の「hello world」でさえ、Cランタイムライブラリへのリンクが必要です。
cHao

74
  1. オブジェクトファイルは、コンパイルされたファイル自体です。2つの間に違いはありません。

  2. 実行可能ファイルは、オブジェクトファイルをリンクすることによって形成されます。

  3. オブジェクトファイルには、CPUが理解できる低レベルの命令が含まれています。これが、マシンコードとも呼ばれる理由です。

  4. この低レベルのマシンコードは、アセンブリ言語を使用して直接記述し、アセンブラを使用してアセンブリ言語コード(英語で表される)をマシン言語(16進数で表される)に処理できる命令のバイナリ表現です。

これは、Cなどの高水準言語のコードに対するこのプロセスの典型的な高水準フローです

->プリプロセッサを通過

->まだCで最適化されたコードを提供する

->コンパイラを通過

->アセンブリコードを提供する

->アセンブラーを通過します

-> OBJECT FILESに格納されているコードを機械語で与える

->リンカーを通過

->実行可能ファイルを取得します。

このフローにはいくつかのバリエーションがあります。たとえば、ほとんどのコンパイラーは、アセンブラーを経由せずに機械語コードを直接生成できます。同様に、彼らはあなたのために前処理を行うことができます。それでも、理解を深めるために構成要素を分割するのは良いことです。


5
最適化されたコードは、プリプロセッサ段階でもその直後にも生成されません。プリプロセッサは独自の言語のみを扱い、それだけです。最適化はコンパイルとアセンブリの段階で行われます。
Ignas2526 2014

コンパイル後に取得するオブジェクトファイルは、機械語の実行可能ファイルと同じです。オブジェクトファイルが最後から2番目のステップで作成され、最後のステップが実行可能ファイルであると言ったので、私は混乱しています。それで、コンパイル後に取得する.0ファイル、それは実行可能ファイルですか?
AV94 2016

単一のオブジェクトファイルも実行できないのですか?
Honey

33

3種類のオブジェクトファイルがあります。

再配置可能なオブジェクトファイル

実行可能オブジェクトファイルを形成するために、リンク時に他の再配置可能オブジェクトファイルと組み合わせることができる形式でマシンコードを含みます。

a.cソースファイルがある場合、GCCでオブジェクトファイルを作成するには、次のコマンドを実行する必要があります。 gcc a.c -c

完全なプロセスは次のようになります。プリプロセッサ(cpp)はacで実行されますその出力(まだソース)はコン​​パイラ(cc1)にフィードされます。その出力(アセンブリ)は、アセンブラ(as)にフィードされ、アセンブラがを生成しrelocatable object fileます。そのファイルには、オブジェクトコードとリンク(および-g使用されている場合はデバッグ)メタデータが含まれており、直接実行できません。

共有オブジェクトファイル

ロード時または実行時に動的にロードできる特別なタイプの再配置可能オブジェクトファイル。共有ライブラリは、これらの種類のオブジェクトの例です。

実行可能オブジェクトファイル

execveなどのローダーによって)メモリに直接ロードして後で実行できるマシンコードが含まれています。

複数の上にリンカを実行した結果です。リンカは、すべての同じタイプの入力セクション(たとえば)を同じタイプの出力セクションにマージすることにより、コマンドラインからすべての入力オブジェクトファイルを左から右にマージします。それを使用し、relocatable object filesexecutable object file.datasymbol resolutionrelocationます。

ボーナス読み取り:

に対してリンクするとstatic library、入力オブジェクトで参照されている関数が最終的な実行可能ファイルにコピーされます。dynamic librariesシンボルテーブルが代わりに作成されることは、ライブラリの機能/グローバルで動的リンクを有効にします。したがって、ライブラリに依存するため、結果は部分的に実行可能なオブジェクトファイルになります。ライブラリが存在しない場合、ファイルは実行できなくなります)。

リンクプロセスは次のように実行できます。 ld a.o -o myexecutable

コマンド:gcc a.c -o myexecutableポイント1とポイント3で言及されたすべてのコマンドを呼び出します(cpp-> cc1-> as-> ld 1

1:実際には、ldのラッパーであるcollect2です。


11

オブジェクトファイルは、1つ(または複数)のソースファイルをコンパイルしたときに得られるものです。

完全に完成した実行可能ファイルまたはライブラリ、あるいは中間ファイルのいずれかです。

オブジェクトファイルには通常、ネイティブコード、リンカー情報、デバッグシンボルなどが含まれています。


2

オブジェクトファイルは、プログラムを実行するための関数、シンボル、およびテキストに依存するコードです。他のテレックスマシンに信号を送信するためにテレタイピングを必要とした古いテレックスマシンと同じように。

プロセッサが実行するためにバイナリコードを必要とするのと同じように、オブジェクトファイルはバイナリコードのようですがリンクされていません。リンクすると追加のファイルが作成されるため、ユーザーはC言語を自分でコンパイルする必要はありません。オブジェクトファイルがc言語やvbなどのコンパイラにリンクされると、ユーザーはexeファイルを直接開くことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.