ホーム プログラミング言語 gcc GCC -c オプション: オブジェクト ファイルの生成

GCC -c オプション: オブジェクト ファイルの生成


C および C++ ソース コードから実行可能ファイルを生成するには、前処理、コンパイル、アセンブル、およびリンクという 4 つのプロセスが必要であることがわかっています。

GCC -E オプション: ソース プログラムの前処理」セクションでは、demo.c ソース ファイルを例として、ソース ファイルを前処理し、対応する demo.i 前処理ファイルを生成する方法を紹介しています。アセンブリ ファイル」セクションでは、demo.c または demo.i をコンパイルし、対応する demo.s アセンブリ コード ファイルを生成する方法を紹介します。

[root@bogon デモ]# ls
デモ.c
[root@bogon デモ]# cat demo.c
#include <stdio.h>
intメイン(){
puts(“ハロー、ワールド!”);
0 を返します。
}
[root@bogon デモ]# gcc -E demo.c -o demo.i
[root@bogon デモ]# ls
デモ.cデモ.i
[root@bogon デモ]# gcc -S demo.i
[root@bogon デモ]# ls
デモ.c デモ.iデモ.s

以上を踏まえて、取得したdmeo.sに対してアセンブル操作を実行し、対応するオブジェクトファイルを取得する方法について説明します。いわゆるオブジェクト ファイルは、基本的にはバイナリ ファイルですが、リンクされていないため、直接実行することはできません。

gcc -c コマンド

簡単に理解すると、アセンブリは実際にはアセンブリ コードを実行可能な機械語命令に変換します。ほとんどのアセンブリ ステートメントは 1 つの機械語命令に対応し、一部のアセンブリ ステートメントは複数の機械語命令に対応します。コンパイル操作と比較して、アセンブリプロセスははるかに簡単で、複雑な構文やセマンティクスがなく、命令の最適化を必要とせず、アセンブリステートメントと機械命令の比較表に従って1つずつ変換するだけで済みます。

-c オプション (小文字の c に注意) を gcc コマンドに追加することにより、GCC コンパイラは指定されたファイルをアセンブリ ステージに処理し、対応するオブジェクト ファイルを生成できます。例えば:

[root@bogon デモ]# gcc -c demo.s
[root@bogon デモ]# ls
demo.c demo.i demo.o demo.s

この命令により、demo.s と同じ名前で拡張子が .o のファイルが生成されることがわかります。これは、アセンブリ操作によって取得されたオブジェクト ファイルです。

もちろん、必要に応じて、gcc -c コマンドに -o オプションを追加して、アセンブリ操作の結果を指定したファイルに入力することもできます。次に例を示します。

[root@bogon デモ]# gcc -c demo.s -o test.o
[root@bogon デモ]# ls
demo.c demo.i demo.o demo.s test.o

gcc -S と同様に、gcc -c オプションは .s ファイルの処理に限定されないことに注意してください。実際、-c オプションは、GCC コンパイラーに指定されたファイルをアセンブリ段階まで処理させるだけで、リンク操作は実行しません。これは次のことも意味します。

  • 指定されたファイルがソース プログラム ファイル (demo.c など) である場合、gcc -c コマンドは、demo.c ファイルの前処理、コンパイル、およびアセンブルの 3 つのステップを実行します。
  • 指定されたファイルが前処理されたばかりのファイル (demo.i など) である場合、gcc -c コマンドは、demo.i ファイルのコンパイルとアセンブルの 2 つのステップを実行します。
  • 指定されたファイルがコンパイルされたばかりのファイル (demo.s など) である場合、gcc -c コマンドは、demo.s ファイルをコンパイルする 1 ステップの操作のみを実行します。

指定されたファイルがアセンブルされている場合、または GCC コンパイラがそれを認識できない場合、gcc -c コマンドは何もしないことに注意してください。

ここでは、demo.c、demo.i、demo.s を例として、gcc -c コマンドの機能を示します。

[root@bogon デモ]# ls
demo.c demo.i デモ.s
[root@bogon デモ]# gcc -c demo.c -o democ.o
[root@bogon デモ]# ls
demo.c demo.i democ.o demo.s
[root@bogon デモ]# gcc -c demo.i -o demoi.o
[root@bogon デモ]# ls
demo.c demo.i demoi.o democ.o demo.s
[root@bogon デモ]# gcc -c demo.s -o demos.o
[root@bogon デモ]# ls
demo.c demo.i demoi.o democ.o demo.s demos.o

上記の操作で生成された democ.o、demoi.o、および demos.o には、それぞれまったく同じバイナリ コンテンツが含まれていますが、ファイル名は異なります。

gcc はリンク操作を実行します

生成されたオブジェクト ファイルを取得したら、gcc コマンドを直接使用してリンク操作を続行できます。次に例を示します。

[root@bogon デモ]# gcc democ.o -o democ.exe
[root@bogon デモ]# ./democ.exe
こんにちは世界!
[root@bogon デモ]# gcc demoi.o -o demoi.exe
[root@bogon デモ]# ./demoi.exe
こんにちは世界!
[root@bogon デモ]# gcc demos.o -o demos.exe
[root@bogon デモ]# ./demos.exe
こんにちは世界!

gcc は、指定されたファイルのサフィックス .o に基づいて、そのようなファイルがターゲット ファイルであると自動的に判断し、リンク操作のみを実行する必要があるため、ここでの gcc の手順では、democ.o、demoi.o、および demos でのみリンク操作を実行します。 .i を実行し、3 つの実行可能ファイル democ.exe、demoi.exe、および demos.exe をそれぞれ生成します。

この 3 つの実行ファイルをそれぞれ実行すると、実行結果はまったく同じであり、democ.o、demo.io、および demos.o に同じバイナリ コンテンツが含まれていることが側面から検証されます。

「 GCC -c オプション: オブジェクト ファイルの生成」についてわかりやすく解説!絶対に観るべきベスト2動画