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