編譯系統

一.什麼是編譯?

編譯是計算機的編譯器基於編程語言、目標機器的指令集和操做系統的約定去生成機器碼(machine code)的過程。
GCC C 編譯器(linux下是cc編譯器)生成的就是彙編碼(assember code)的一種形式。而彙編碼是機器碼不一樣程序指令給出的文本表示。
GCC 同時調用一個彙編器(assember code)和連接器(linker)從彙編碼中生成可執行的機器碼。-- csapp書 p188linux

二.編譯的流程

好比咱們使用了這樣的命令:編程

gcc -o my_exe p1.c p2.c

這條簡單的gcc命令實際上包含4個過程:windows

1.預處理:
C 預處理器(preprocesor)會把須要的#include 標識的文件和#define聲明的宏(macros) 添加到源代碼(source code)中。
2.編譯:
C 編譯器會生成彙編碼,依據源碼生成了相應的兩個p1.s 和p2.sapp

3.彙編:
彙編器把上面的彙編碼轉換成二進制的目標文件(object-code file) p1.o 和 p2.o. 目標代碼是機器碼的一種二進制文本形式--它包含了所有的指令。可是沒有包含全局變量的地址。編程語言

4.連接:
連接器歸併這兩個目標文件和代碼須要調用的庫函數(好比printf),生成了可執行(excutable)的機器碼--文件 my_exe函數

參考這篇: https://blog.csdn.net/xiaohouye/article/details/52084770編碼

值得注意的地方:操作系統

  1. 這個過程的機器碼有兩種形式的,一種是第三步產生的 .o目標文件,一種是最後的可執行文件my_exe。
  2. 連接的過程有靜態連接和動態連接。靜態連接會把靜態庫文件所有加入到可執行代碼中,動態連接只是在運行時,把調用的庫加入到可執行性程序。動態的庫通常在linux文件名爲.so,在windows下爲dll。

三.編譯過程的流程圖
我繪製了一個完整的C編譯系統的流程:.net

相關文章
相關標籤/搜索