C語言的編譯連結執行過程

Daiina發表於2018-10-31

C語言的編譯連結執行過程

​ 機器不能識別高階語言,而對我們來說高階語言更方便理解,這需要編譯器的幫助才能完成中間的轉化過程:將高階語言轉化成機器能識別的二進位制檔案。

​ 而一個C程式在執行過程中,需要經歷兩個環境:編譯環境和執行環境

編譯環境的四個步驟

在這裡插入圖片描述

  • 預處理:對原始碼進行處理
  • 編譯:生成組合語言
  • 彙編:將組合語言轉化成機器語言
  • 連結:將生成的目標檔案與相關的目標檔案或標準庫連結,生成可執行檔案。

在這裡插入圖片描述

預處理

預處理過後的原始碼仍然是.c檔案,這個過程中只是對原始碼進行了一些替換,刪除,新增動作。如果你的程式即便語法錯誤,這個步驟仍然會執行

  • 對#include檔案替換
  • 巨集#define的遞迴替換
  • 條件預編譯指令的替換
  • 去掉註釋
  • 保留#pragma指令,編譯器會用到。

編譯

編譯的過程會將.c檔案轉換成組合語言,再轉換之前會先原始碼進行詞法分析、語法分析、語義分析、符號彙總,再將對應的原始碼翻譯成組合語言,這裡的組合語言,其實是機器碼的助記符

​ 符號彙總,是將程式中的函式名,全域性變數看作一個符號,便於在連結過程中找到相應的位置。

彙編

彙編將組合語言轉換成對應的二進位制語言,即機器指令。將.s語言生成.obj的目標檔案。

​ 目標檔案由段組成,通常一個目標檔案中至少兩個段:

  • 程式碼段:主要是程式的指令,可讀可執行,但不可寫
  • 資料段:存放程式要用到的臨時變數或靜態資料庫,可讀,可執行,可寫

不同CPU對應的機器碼不同

連結

將多個目標檔案連結成可執行檔案,合併段表,符號表的重定向。

<在Linux 下程式設計時,我們可以根據這個過程寫一個Makefile檔案,方便修改編譯。

執行環境

  • 程式在過程中必須載入程式,CPU通過執行記憶體中的指令開始執行程式。

  • 程式的執行從呼叫main函式開始

相關文章