Cのライブラリについて読んでいますが、オブジェクトファイルとは何かについての説明はまだありません。他のコンパイル済みファイルとオブジェクトファイルの本当の違いは何ですか?
誰かが人間の言葉で説明できたら嬉しいです。
オブジェクトファイルは、コンパイルフェーズからの実際の出力です。ほとんどはマシンコードですが、リンカがその中にあるシンボルや、動作するために必要なシンボルを確認できる情報があります。 (参照用に、「シンボル」は基本的にグローバルオブジェクト、関数などの名前です。)
リンカは、これらすべてのオブジェクトファイルを取得し、それらを結合して1つの実行可能ファイルを形成します(可能な場合、つまり、重複または未定義のシンボルがないと仮定します)。コマンドラインオプションを使用して「コンパイルする」ように指示しない場合、多くのコンパイラがこれを行います(読み取り:独自にリンカーを実行します)。 (-c
は一般的な「コンパイルのみ;リンクしない」オプションです。)
オブジェクトファイルは、コンパイルされたファイルそのものです。 2つの間に違いはありません。
実行可能ファイルは、オブジェクトファイルをリンクすることによって形成されます。
オブジェクトファイルには、CPUが理解できる低レベルの命令が含まれています。それがマシンコードとも呼ばれる理由です。
この低レベルマシンコードは、アセンブリ言語を使用して直接記述し、アセンブラーを使用してアセンブリ言語コード(英語で表示)をマシン言語(Hexで表示)に処理することもできる命令のバイナリ表現です。
Cなどの高レベル言語のコードのこのプロセスの典型的な高レベルフローを次に示します。
->プリプロセッサを通過します
->最適化されたコードを、まだCで提供するため
->コンパイラを通過します
->アセンブリコードを提供する
->アセンブラを通過します
-> OBJECT FILESに保存されている機械語のコードを提供する
->リンカーを通過
->実行可能ファイルを取得します。
このフローにはいくつかのバリエーションがあります。たとえば、ほとんどのコンパイラーは、アセンブラーを介さずに機械語コードを直接生成できます。同様に、彼らはあなたのために前処理をすることができます。それでも、理解を深めるために構成要素を分割することは素晴らしいことです。
オブジェクトファイルには3種類あります。
実行可能なオブジェクトファイルを形成するために、リンク時に他の再配置可能なオブジェクトファイルと組み合わせることができる形式でマシンコードを含めます。
a.c
ソースファイルがある場合、GCCでオブジェクトファイルを作成するには、gcc a.c -c
を実行する必要があります。
完全なプロセスは次のようになります。プリプロセッサ(cpp)はa.cで実行されます。その出力(まだソース)はコンパイラー(cc1)に送られます。その出力(Assembly)はアセンブラー(as)に供給され、relocatable object file
が生成されます。このファイルには、オブジェクトコードとリンク(および-g
が使用された場合のデバッグ)メタデータが含まれており、直接実行できません。
ロード時または実行時に動的にロードできる特別なタイプの再配置可能オブジェクトファイル。共有ライブラリは、これらの種類のオブジェクトの例です。
メモリに直接読み込むことができるマシンコードを含みます(ローダーによって、たとえば execve )。その後実行できます。
複数のrelocatable object files
でリンカーを実行した結果は、executable object file
です。リンカは、すべての同じタイプの入力セクション(例:.data
)を同じタイプの出力セクションにマージすることにより、コマンドラインからのすべての入力オブジェクトファイルを左から右にマージします。 symbol resolution
とrelocation
を使用します。
static library
に対してリンクする場合、入力オブジェクトで参照される関数は最終的な実行可能ファイルにコピーされます。 dynamic libraries
を使用すると、代わりに、ライブラリの関数/グローバルとの動的リンクを可能にするシンボルテーブルが作成されます。したがって、結果はライブラリに依存するため、部分的に実行可能なオブジェクトファイルになります。ライブラリが存在しない場合、ファイルは実行できなくなります)。
リンクプロセスは次のように実行できます。ld a.o -o myexecutable
コマンドgcc a.c -o myexecutable
は、ポイント1およびポイント3で言及されたすべてのコマンドを呼び出します(cpp-> cc1-> as-> ld1)
1:実際には、ld2のラッパーであるcollect2です。
オブジェクトファイルは、1つ(または複数)のソースファイルをコンパイルしたときに得られるものです。
完全に完成した実行可能ファイルまたはライブラリ、または中間ファイルのいずれかです。
通常、オブジェクトファイルには、ネイティブコード、リンカー情報、デバッグシンボルなどが含まれています。
オブジェクトファイルは、プログラムを実行するための関数、シンボル、およびテキストに依存するコードです。古いテレックス機と同様に、他のテレックス機に信号を送信するためにテレタイピングが必要でした。
プロセッサの実行にバイナリコードが必要なのと同じように、オブジェクトファイルはバイナリコードに似ていますが、リンクされていません。ユーザーがC言語を自分でコンパイルする必要がないように、リンクにより追加のファイルが作成されます。オブジェクトファイルがc言語やvbなどのコンパイラにリンクされると、ユーザーはexeファイルを直接開くことができます。