リンク、マウント、ライブラリ

4008 ワード


 
二、コンパイルとリンク
通常、コンパイルは、前処理、コンパイル、アセンブリ、リンクの4つのステップに分けられます.
1、前処理プロセスは主に#から始まる前コンパイルコマンド、例えば#include/#define/#ifなどを処理するが、#pragmaコンパイラコマンド(コンパイラが使用するため)を保持し、またすべてのコメントを削除し、行番号とファイル名識別を追加する. 
gcc -E test.c > test.i

cpp test.c > test.i

2、コンパイル、生成*.sのアセンブリコード
gcc -S test.c

cc1 test.c

3、アセンブリ、アセンブリ指令と機械指令対照表による翻訳
gcc -c test.s -o test.o

as test.s -o test.o

4、リンク、ldコマンドはcrtライブラリや入り口などを付けて、覚えられない場合はgcc testを使うことができます.c-Wl,-vで表示します.
gcc test.o -o test

ld --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib/../lib64/crt1.o /usr/lib/../lib64/crti.o /usr/local/gcc-4.8.2/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/crtbegin.o -L/usr/local/gcc-4.8.2/lib/gcc/x86_64-unknown-linux-gnu/4.8.2 -L/usr/local/gcc-4.8.2/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/local/gcc-4.8.2/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/../../..  -v -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/local/gcc-4.8.2/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/crtend.o /usr/lib/../lib64/crtn.o test.o

 
コンパイラのコンパイルプロセスは、一般的に6つのステップに分けられます.スキャン、構文分析、意味分析、ソースコード最適化、コード生成、ターゲットコード最適化です.
 
リンクは原理的に言えば、いくつかの命令を他のシンボルアドレスの参照を修正することにほかならない.その過程にはアドレスと空間分配、シンボル決議と再位置決めが含まれている.簡単に言えば、アドレス修正である.
 
現在PCプラットフォームで流行している実行可能ファイルフォーマットは、Windowsの下のPE(Portable Executable)とLinuxの下のELF(Executable Linkable Format)に分けられ、これらはすべてCOFF(Common file format)フォーマットの変種である.
ターゲットファイル(すなわち.oファイル)は実行可能ファイルの内容と構造が似ているため、実行可能ファイルと同じフォーマットで格納され、ターゲットファイルのほか、ダイナミックリンクライブラリと静的リンクライブラリ(ターゲットファイルのパッケージ化に加え、インデックスもいくつか追加)、コアダンプファイルも実行可能ファイルフォーマットで格納される.
ターゲットファイルの内容には、その命令コード、データ、リンクに必要なシンボルテーブル、デバッグ情報、文字列などが含まれています.ターゲットファイルフォーマットは、これらの情報を異なる属性で「セクション」として格納し、セグメント(Segment)とも呼ばれ、一定の長さの領域を表す場合があります.
Linuxではfileコマンドを使用して、対応するファイルフォーマットを表示できます.
一般にコンパイルされたマシンコードは.textセグメントは、初期化されたグローバル変数と局所静的変数が保存する.dataセグメントは、初期化されていないグローバル変数と局所静的変数が保存する.bssセグメント.dataセグメントは変数に空間を割り当てますが、初期化されていないグローバル変数とローカル静的変数のデフォルト値は0であり、その割り当て空間は必要ありません.
プログラム指令とプログラムデータとを分離する、bssセグメントは読み取り専用であり、複数のコピーが同時に実行されると、動的リンクライブラリなどの共有命令を実現することもできる.
.bssセグメントは、初期化されていないグローバル変数とローカル静的変数の予約位置にすぎず、コンテンツがないため、空間も占有しない.