私が理解しているように、GCCコンパイラはCプログラムをコンパイルするときに4つのステップを実行します。コンパイルプロセスのリンクは実際に何をしていますか?
- 前処理 - Cマクロ(* .C)
- コンパイルせずにCコードにマクロでコード(* .C) - アセンブリ言語とCコード(* .C)(* .S)
- コードをObjectにアセンブリ言語(* .S)を(* .o)は
- リンク - - 組立オブジェクトコード(* .o)は実行可能ファイルへの(*)
最初の3つのステップは、私には完璧な意味をなします私はまだリンクが実際に何をしているのか混乱しています。
手順3の後、* .oファイルを実行できないのはなぜですか?その時点で私のCコードはオブジェクト/マシン/バイトコードになり、CPUが直接解釈することができます。しかし、私は私の* .oのファイルを実行可能にしますし、私はこのエラーを取得し、それを実行しようとすると:
bash: ./helloworld.o: cannot execute binary file: Exec format error
なぜ私はこのエラーが出るのですか? 1つのCファイルしかない小さなCプログラム(例えば、hello worldプログラム)を持っていると、リンクするものがないので、リンクは目的がないように見えます。では、コンパイルプロセスでのリンクは実際に何をしていますか?
お返事ありがとうございます。
helloworldプログラムで使用している 'printf()'はどうですか?それはどこから来たのですか? –
@SouravGhosh本当に、私はそれについて考えなかった。したがって、リンクするだけで私のオブジェクトファイルがリンクされるだけでなく、他のオブジェクトファイル(標準ライブラリなど)もリンクされます。ありがとうございました。 – OhFiddyYouSoWiddy