Cのライブラリについて読んでいますが、オブジェクトファイルの説明はまだわかりません。他のコンパイル済みファイルとオブジェクトファイルの実際の違いは何ですか?
誰かが人間の言語で説明できたらうれしいです。
Cのライブラリについて読んでいますが、オブジェクトファイルの説明はまだわかりません。他のコンパイル済みファイルとオブジェクトファイルの実際の違いは何ですか?
誰かが人間の言語で説明できたらうれしいです。
回答:
オブジェクトファイルは、コンパイルフェーズからの実際の出力です。これはほとんどがマシンコードですが、リンカがその中にあるシンボルと、機能するために必要なシンボルを確認できるようにする情報があります。(参考までに、「シンボル」は基本的にグローバルオブジェクト、関数などの名前です)
リンカーはこれらすべてのオブジェクトファイルを受け取り、それらを結合して1つの実行可能ファイルを作成します(可能な場合、つまり、重複または未定義のシンボルがないことを前提とします)。コマンドラインオプションを使用して「コンパイルするだけ」と指示しないと、多くのコンパイラーがこれを行います(読み取り:リンカーは自分で実行します)。(-c
一般的な「コンパイルするだけです。リンクしない」オプションです。)
オブジェクトファイルは、コンパイルされたファイル自体です。2つの間に違いはありません。
実行可能ファイルは、オブジェクトファイルをリンクすることによって形成されます。
オブジェクトファイルには、CPUが理解できる低レベルの命令が含まれています。これが、マシンコードとも呼ばれる理由です。
この低レベルのマシンコードは、アセンブリ言語を使用して直接記述し、アセンブラを使用してアセンブリ言語コード(英語で表される)をマシン言語(16進数で表される)に処理できる命令のバイナリ表現です。
これは、Cなどの高水準言語のコードに対するこのプロセスの典型的な高水準フローです
->プリプロセッサを通過
->まだCで最適化されたコードを提供する
->コンパイラを通過
->アセンブリコードを提供する
->アセンブラーを通過します
-> OBJECT FILESに格納されているコードを機械語で与える
->リンカーを通過
->実行可能ファイルを取得します。
このフローにはいくつかのバリエーションがあります。たとえば、ほとんどのコンパイラーは、アセンブラーを経由せずに機械語コードを直接生成できます。同様に、彼らはあなたのために前処理を行うことができます。それでも、理解を深めるために構成要素を分割するのは良いことです。
3種類のオブジェクトファイルがあります。
実行可能オブジェクトファイルを形成するために、リンク時に他の再配置可能オブジェクトファイルと組み合わせることができる形式でマシンコードを含みます。
a.c
ソースファイルがある場合、GCCでオブジェクトファイルを作成するには、次のコマンドを実行する必要があります。
gcc a.c -c
完全なプロセスは次のようになります。プリプロセッサ(cpp)はacで実行されますその出力(まだソース)はコンパイラ(cc1)にフィードされます。その出力(アセンブリ)は、アセンブラ(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-> ld 1)
1:実際には、ldのラッパーであるcollect2です。