2016-09-26 12 views
-1

私はいくつかの(非常に)低レベルのプログラミングに取り組んでいますが、すべてが完全に私には分かりません。まず、gccを使ってelfやオブジェクトファイルを作成するための.cpp(または.c)ファイルを作成しますが、オブジェクトファイルは何ですか?私は "as"コンパイラを使用するとオブジェクトファイルを取得しますが、これらはどのように使用され、ストレートバイナリを持つことができるときにオブジェクトファイルを持つ目的は何ですか?C++はどのようにコンパイルされますか

+0

[Cのオブジェクトファイルとは何ですか?](http://stackoverflow.com/questions/7718299/whats-an-object-file- in-c) – Pyves

答えて

1

この質問については、この非常に明確な説明がsiteです。私は下にそれを貼り付けました。しかし、私は強くあなたがウェブサイト上の図を見てみることをお勧めします。それはあなたに何が起こっているのかについてより高いレベルの理解を与えるでしょう。

C++でソースコードファイルをコンパイルするには、4つの手順があります。たとえば、prog1.cppという名前のC++ソースコードファイルを持っている場合、あなたはコンパイルコマンドを実行

グラム++ -Wall -ansi -o PROG1 prog1.cpp コンパイルプロセスは、次のようになります

  1. C++プリプロセッサは、インクルードされたヘッダファイルの内容をソースコードファイルにコピーし、マクロコードを生成し、#defineを使って定義されたシンボル定数をそれらの値に置き換えます。
  2. C++プリプロセッサによって生成された展開されたソースコードファイルは、プラットフォームのアセンブリ言語にコンパイルされます。
  3. コンパイラによって生成されたアセンブラコードは、プラットフォーム用のオブジェクトコードにアセンブルされます。
  4. アセンブラで生成されたオブジェクトコードファイルは、実行可能ファイルを生成するために使用されるライブラリ関数のオブジェクトコードファイルとリンクされています。

適切なコンパイラオプションを使用することで、このプロセスをいつでも停止できます。

  1. プリプロセッサ工程後のプロセスを停止するには、-Eオプションを使用することができます。

    グラム++ -E prog1.cpp 展開されたソースコードファイルを標準出力に出力されます(画面により、デフォルト);必要に応じて出力をファイルにリダイレクトすることができます。展開されたソースコードファイルは非常に大きいことに注意してください.20行のソースコードファイルは、どのヘッダーファイルが含まれているかに応じて、20,000行以上の展開ファイルを簡単に生成できます。

  2. あなたは、-Sオプションを使用することができ、コンパイルステップの後にプロセスを停止するには、次の

    グラム++ -Wall -ansi -S prog1.cppデフォルトで 、ファイル名という名前のソース・ファイルのアセンブラコード。 cppはfilename.sという名前のファイルに置かれます。

  3. は、-cオプションを使用することができ、組立工程の後にプロセスを停止するには、次の

    グラム++ -Wall -c -ansi prog1.cppデフォルトで 、ソースファイルの名前ファイル名のアセンブラコード。 cppはfilename.oという名前のファイルに配置されます

+0

素晴らしい!これはまさに私の質問に答えました! – dalearn

+0

しかし、それがアセンブリにコンパイルされる場合、ベアメタルプログラミングでスタックが必要なのはなぜですか? – dalearn

+0

ええ、この情報を入手しているソースを教えてください。明確にするのが簡単になります。 –