C語言的編譯連結執行過程
C語言的編譯連結執行過程
機器不能識別高階語言,而對我們來說高階語言更方便理解,這需要編譯器的幫助才能完成中間的轉化過程:將高階語言轉化成機器能識別的二進位制檔案。
而一個C程式在執行過程中,需要經歷兩個環境:編譯環境和執行環境
編譯環境的四個步驟
- 預處理:對原始碼進行處理
- 編譯:生成組合語言
- 彙編:將組合語言轉化成機器語言
- 連結:將生成的目標檔案與相關的目標檔案或標準庫連結,生成可執行檔案。
預處理
預處理過後的原始碼仍然是.c檔案,這個過程中只是對原始碼進行了一些替換,刪除,新增動作。如果你的程式即便語法錯誤,這個步驟仍然會執行。
- 對#include檔案替換
- 巨集#define的遞迴替換
- 條件預編譯指令的替換
- 去掉註釋
- 保留#pragma指令,編譯器會用到。
編譯
編譯的過程會將.c檔案轉換成組合語言,再轉換之前會先原始碼進行詞法分析、語法分析、語義分析、符號彙總,再將對應的原始碼翻譯成組合語言,這裡的組合語言,其實是機器碼的助記符。
符號彙總,是將程式中的函式名,全域性變數看作一個符號,便於在連結過程中找到相應的位置。
彙編
彙編將組合語言轉換成對應的二進位制語言,即機器指令。將.s語言生成.obj的目標檔案。
目標檔案由段組成,通常一個目標檔案中至少兩個段:
- 程式碼段:主要是程式的指令,可讀可執行,但不可寫
- 資料段:存放程式要用到的臨時變數或靜態資料庫,可讀,可執行,可寫
不同CPU對應的機器碼不同
連結
將多個目標檔案連結成可執行檔案,合併段表,符號表的重定向。
<在Linux 下程式設計時,我們可以根據這個過程寫一個Makefile檔案,方便修改編譯。
執行環境
-
程式在過程中必須載入程式,CPU通過執行記憶體中的指令開始執行程式。
-
程式的執行從呼叫main函式開始
相關文章
- C語言編譯和連結過程簡介C語言編譯
- 【開發語言】PHP、Java、C語言的編譯執行過程PHPJavaC語言編譯
- C語言編譯全過程C語言編譯
- 3- C語言編譯過程C語言編譯
- C語言編譯過程簡介C語言編譯
- C語言_來了解一下GCC編譯器編譯C可執行指令碼的過程C語言GC編譯指令碼
- gcc 從語言編譯全過程 預處理---->編譯---->彙編----->連結GC編譯
- 編譯連結過程編譯
- go語言編譯過程概述Go編譯
- C/C++預處理、編譯、連結過程【Z】C++編譯
- GCC編譯和連結過程GC編譯
- C語言程式碼區錯誤以及編譯過程C語言編譯
- 程式語言執行過程
- 編譯、連結學習筆記(一)簡述編譯連結過程編譯筆記
- GCC編譯過程(預處理->編譯->彙編->連結)GC編譯
- Notepad++編譯和執行C語言 (GCC)編譯C語言GC
- 初探 Go 的編譯命令執行過程Go編譯
- C語言-->(十四)結構體、巨集、編譯C語言結構體編譯
- 從彙編角度分析C語言的過程呼叫C語言
- C語言編譯工具C語言編譯
- (嵌入式)Windows與Ubantu下的C語言程式的編譯執行WindowsC語言編譯
- c語言程式的執行過程(以輸出hello,world為例)C語言
- 編譯C++ 程式的過程編譯C++
- sql語句執行過程小結SQL
- javascript引擎執行的過程的理解--語法分析和預編譯階段JavaScript語法分析編譯
- Java程式碼編譯和執行的整個過程Java編譯
- 你不知道的C語言–第一篇——編譯和執行C語言編譯
- C/C++編譯過程詳解C++編譯
- vim編譯執行c編譯
- 如何編譯執行HanLP自然語言處理包編譯HanLP自然語言處理
- C語言編寫靜態連結庫及其使用C語言
- c語言多檔案編譯C語言編譯
- C程式編譯過程淺析C程式編譯
- C語言 連結串列排序C語言排序
- Android編譯通過,執行編譯錯誤問題總結Android編譯
- 編譯器的編譯基本過程編譯
- 使用 Sublime Text 3 編譯 C 語言編譯
- C語言編譯器手機版C語言編譯