2016-06-13 14 views
3

私が理解しているように、GCCコンパイラはCプログラムをコンパイルするときに4つのステップを実行します。コンパイルプロセスのリンクは実際に何をしていますか?

  1. 前処理 - Cマクロ(* .C)
  2. コンパイルせずにCコードにマクロでコード(* .C) - アセンブリ言語とCコード(* .C)(* .S)
  3. コードをObjectにアセンブリ言語(* .S)を(* .o)は
  4. リンク - - 組立オブジェクトコード(* .o)は実行可能ファイルへの(*)

最初の3つのステップは、私には完璧な意味をなします私はまだリンクが実際に何をしているのか混乱しています。

手順3の後、* .oファイルを実行できないのはなぜですか?その時点で私のCコードはオブジェクト/マシン/バイトコードになり、CPUが直接解釈することができます。しかし、私は私の* .oのファイルを実行可能にしますし、私はこのエラーを取得し、それを実行しようとすると:

bash: ./helloworld.o: cannot execute binary file: Exec format error

なぜ私はこのエラーが出るのですか? 1つのCファイルしかない小さなCプログラム(例えば、hello worldプログラム)を持っていると、リンクするものがないので、リンクは目的がないように見えます。では、コンパイルプロセスでのリンクは実際に何をしていますか?

お返事ありがとうございます。

+3

helloworldプログラムで使用している 'printf()'はどうですか?それはどこから来たのですか? –

+0

@SouravGhosh本当に、私はそれについて考えなかった。したがって、リンクするだけで私のオブジェクトファイルがリンクされるだけでなく、他のオブジェクトファイル(標準ライブラリなど)もリンクされます。ありがとうございました。 – OhFiddyYouSoWiddy

答えて

3

If I have a tiny C program (for example a hello world program)

でもあなたのHelloWorldプログラムは、それは、#inlude<stdio.h>を使用していないのですか?これはあなたがライブラリを使用していることを意味し、リンクするステップは必要なオブジェクトコード(ここではライブラリコード)を組み合わせてバイナリを作成することです。


連結ステップは、何の詳細な説明について

(およびコンパイルと比較) - ラフ説明にリンクこのquestion

+0

これは質問に答えません。 OPは完全に空の 'main'プログラムを作成する可能性があり、依然としてオブジェクトファイルを実行できませんでした。 – user694733

+1

でも、ローダーのエントリーポイント(たいていは_start)からメイン関数に到達するためには、リンクする必要のあるものがたくさんあります。 – doron

+0

@doronありがとう、他のもののいくつかの例を教えていただけますか? – OhFiddyYouSoWiddy

3

である参照:

  • 各々からの全てのマッチング・セグメントを探しますオブジェクトファイルを作成し、それらを連結します。このようにして、1つの大きな.code、1つの.data、1つの.bssなどで終わります。
  • 使用されているすべての記号を解決します。多くのシンボルはローカルなので、すぐに解決できます。未解決のシンボルは、リンクが要求されたライブラリで検索されます。これが完了すると、結果はシンボルテーブル/リンクマップになります。
  • 実際に実行可能なファイルを作成します。 Linuxでは、通常、実行可能ファイル、ライブラリ、オブジェクトファイルのすべてがELF形式です。これはすべてのプラットフォームで当てはまるわけではありません。
+0

あなたの答えをありがとう、あなたが受け入れたので@artm答えをマークしましたが、あなたも非常に有用でした。 – OhFiddyYouSoWiddy

2

単純な答えは、.o実行可能ファイルが異なる目的を果たし、異なる形式を持つことです。

完全な回答が必要な場合は、プラットフォームのバイナリ形式に必要なドキュメントを読む必要があります。

Linuxの場合、これはhereになります。このドキュメントでは、中間形式と最終実行形式の違いについて説明します。

linuxカーネルモジュールローダーは、.o(またはむしろ.ko)ファイルをそのまま使用します。

+0

ELFリンクをありがとうございます。私はそれを読むでしょう。 – OhFiddyYouSoWiddy

関連する問題