C のライブラリについて読んでいますが、オブジェクト ファイルとは何かについての説明をまだ見つけていません。他のコンパイル済みファイルとオブジェクト ファイルの本当の違いは何ですか?
どなたか人間の言葉で説明していただけると幸いです。
6 に答える
オブジェクト ファイルは、コンパイル フェーズからの実際の出力です。ほとんどがマシンコードですが、リンカーがその中にあるシンボルと、動作するために必要なシンボルを確認できる情報を持っています。(参考までに、「シンボル」は基本的にグローバルオブジェクト、関数などの名前です。)
リンカーはこれらすべてのオブジェクト ファイルを取得し、それらを組み合わせて 1 つの実行可能ファイルを形成します (実行可能であると仮定します。つまり、重複したシンボルや未定義のシンボルがないことを前提としています)。コマンドラインオプションを使用して「ただコンパイルする」ように指示しない場合、多くのコンパイラがこれを行います(読んでください:リンカを独自に実行します)。(-c
は一般的な「コンパイルのみ、リンクしない」オプションです。)
オブジェクト ファイルは、コンパイルされたファイルそのものです。両者に違いはありません。
実行可能ファイルは、オブジェクト ファイルをリンクすることによって形成されます。
オブジェクト ファイルには、CPU が理解できる低レベルの命令が含まれています。そのため、マシンコードとも呼ばれます。
この低レベルのマシン コードは命令のバイナリ表現であり、アセンブリ言語を使用して直接記述し、アセンブラを使用してアセンブリ言語コード (英語で表現) を機械語 (16 進数で表現) に処理することもできます。
C などの高水準言語のコードのこのプロセスの一般的な高レベル フローを次に示します。
--> プリプロセッサを通過
--> 最適化されたコードを提供する (まだ C である)
--> コンパイラを通過
--> アセンブリコードを与える
--> アセンブラを経由します
--> OBJECT FILES に格納されている機械語のコードを与える
--> リンカーを経由
--> 実行ファイルを取得します。
このフローにはいくつかのバリエーションがあります。たとえば、ほとんどのコンパイラは、アセンブラを経由せずに機械語コードを直接生成できます。同様に、彼らはあなたのために前処理を行うことができます. それでも、理解を深めるために構成要素を分割することは良いことです。
オブジェクト ファイルは、1 つ (または複数) のソース ファイルをコンパイルしたときに得られるものです。
完全に完成した実行可能ファイルまたはライブラリ、または中間ファイルのいずれかです。
通常、オブジェクト ファイルには、ネイティブ コード、リンカー情報、デバッグ シンボルなどが含まれます。
C++ コンパイラがすべてのヘッダー ファイルをインクルードして展開した後、ソース コードをオブジェクト コード ファイルに変換することで、プログラムをコンパイルできます。オブジェクト コード ファイルには、ソース コードのバイナリ バージョン (大まかに言えばマシン コード) のみが含まれます。また、たとえば、プログラムに 3 つの cpp ファイルがある場合、コンパイラは 3 つのオブジェクト ファイルを生成します。