『プログラマーの自己修養』第二章リンクロードとライブラリ
1204 ワード
gcc hello.c実行時には、前処理、コンパイル、アセンブリ、リンクの4つのステップに分かれています.
1.前処理(前コンパイル)
プログラムがあるc,前処理生成.iファイル.linuxでの前処理cファイル生成iファイルの命令は以下の通りである:(両方のいずれでもよい)
前処理は、主に#で始まる前コンパイル命令を処理する.は、include、defineなどの命令を処理する. すべてのコメント//および/**/ を削除行番号とファイル識別名 を追加すべてのpragmaコンパイル命令 を保持する.
プリコンパイル後のiファイルにはマクロ定義は含まれません.マクロ定義が展開されているからです.含まれるファイルも挿入する.iファイルにあります.したがって、マクロ定義が正しいか、ヘッダファイルが正しいかを判断できない場合に表示することができる.iファイルで問題を特定します.
2.コンパイル
構文解析、構文解析、意味解析、および最適化の後、対応するアセンブリファイルを生成します.
3.アセンブリ
アセンブリコードをマシンで実行可能なコマンドに変換します.次の3つの文で目的を達成できます.
4.リンク
1つのプログラムが複数のモジュールに分割された後、これらのモジュール間でどのように単一のプログラムを形成するかは解決すべき問題である.モジュール間の組合せ問題は、異なるモジュール間の共通変数またはコードセグメントペアの問題を処理するため、スペルマップと同様のモジュール間の通信問題である.このプロセスはリンクで解決する必要があります.
各ソースモジュールを独立してコンパイルし、必要に応じて組み立てるプロセスがリンクです.リンク・プロシージャには、主にアドレスと空間の割り当て、シンボルの決定、再配置などのステップが含まれます.
各モジュールのソースファイルはコンパイラによってコンパイルされてターゲットファイルを形成し、ターゲットファイルはライブラリとともにリンクして実行可能ファイルを形成する.
1.前処理(前コンパイル)
プログラムがあるc,前処理生成.iファイル.linuxでの前処理cファイル生成iファイルの命令は以下の通りである:(両方のいずれでもよい)
$gcc -E hello.c -o hello.i
$cpp hello.c > hello.i
前処理は、主に#で始まる前コンパイル命令を処理する.
プリコンパイル後のiファイルにはマクロ定義は含まれません.マクロ定義が展開されているからです.含まれるファイルも挿入する.iファイルにあります.したがって、マクロ定義が正しいか、ヘッダファイルが正しいかを判断できない場合に表示することができる.iファイルで問題を特定します.
2.コンパイル
構文解析、構文解析、意味解析、および最適化の後、対応するアセンブリファイルを生成します.
$gcc -S hello.i -c hello.s
3.アセンブリ
アセンブリコードをマシンで実行可能なコマンドに変換します.次の3つの文で目的を達成できます.
$as hello.s -o hello.o//as
$gcc -c hello.s -o hello.o//
$gcc -c hello.c -o hello.o//
4.リンク
1つのプログラムが複数のモジュールに分割された後、これらのモジュール間でどのように単一のプログラムを形成するかは解決すべき問題である.モジュール間の組合せ問題は、異なるモジュール間の共通変数またはコードセグメントペアの問題を処理するため、スペルマップと同様のモジュール間の通信問題である.このプロセスはリンクで解決する必要があります.
各ソースモジュールを独立してコンパイルし、必要に応じて組み立てるプロセスがリンクです.リンク・プロシージャには、主にアドレスと空間の割り当て、シンボルの決定、再配置などのステップが含まれます.
各モジュールのソースファイルはコンパイラによってコンパイルされてターゲットファイルを形成し、ターゲットファイルはライブラリとともにリンクして実行可能ファイルを形成する.