C语言——程序的编译+链接(linux+gcc实现过程)
文章目錄
- 前言
- 一、預處理
- 1.預處理階段的操作:
- 1.預處理過程實現:
- 二、編譯
- 1.編譯階段的操作:
- 2.編譯過程的實現:
- 三、匯編
- 1.匯編階段的操作:
- 2.匯編過程的實現:
- 四、鏈接
- 1.鏈接階段的操作:
- 2.鏈接過程的實現:
前言
一個程序要運行,一定要經歷四個步驟。依次是: 預處理、編譯、匯編和鏈接。那么接下來就依次拆解這些過程來更好的理解程序是如何運行起來的。
首先簡述一下各步驟的內容:
- 預處理:展開頭文件/宏替換/去掉注釋/條件編譯
- 編譯 :檢查語法,生成匯編代碼
- 匯編:把匯編代碼轉成二進制機器碼寫入目標文件
- 鏈接:鏈接各模塊生成可執行程序
后面展開討論————
一、預處理
1.預處理階段的操作:
1.預處理過程實現:
可以使用linux來實現預處理到鏈接的過程并觀察
gcc指令的用法
-E選項:提示編譯器執行完預處理就停下來,后邊的編譯、匯編、鏈接就先不執行了。
-S選項:提示編譯器執行完編譯就停下來,不去執行匯編和鏈接了。
-c選項:提示編譯器執行完匯編就停下來。
使用 gcc 命令不跟任何的選項的話,會默認執行預處理、編譯、匯編、鏈接這整個過程,如果程序沒有錯,就會得到一個可執行文件,默認為a.out,使用 -o + 文件名可定義生成可執行文件的名稱。
一個簡單的代碼理解預處理
首先,編輯一個test.c文件,里面有注釋,宏定義及預編譯指令等,執行gcc -E test.c -o test.i,生成一個test.i文件。
觀察發現,文件變成了900行左右,宏定義已經被替換掉了,注釋等也已經刪除。上面的部分即stdio.h包含的代碼。
二、編譯
1.編譯階段的操作:
編譯過程是整個程序構建的核心部分,編譯成功,會將源代碼由文本形式轉換成機器語言,編譯過程就是把預處理完的文件進行一系列詞法分析、語法分析、語義分析以及優化后生成相應的匯編代碼文件。
2.編譯過程的實現:
依然是上面的簡單代碼,針對生成的test.i文件執行gcc -S test.i -o test.s,生成一個test.s文件。
觀察test.s文件,已經從之前的文本形式轉換成匯編代碼。
三、匯編
1.匯編階段的操作:
匯編過程調用匯編器as來完成,是用于將匯編代碼轉換成機器可以執行的指令,每一個匯編語句幾乎都對應一條機器指令。
2.匯編過程的實現:
針對生成的test.s文件執行gcc -c test.s -o test.o,生成一個test.o文件。
文件將變成這樣的只有機器才能看懂的語言啦。
四、鏈接
1.鏈接階段的操作:
鏈接的主要內容就是將各個模塊之間相互引用的部分正確的銜接起來。它的工作就是把一些指令對其他符號地址的引用加以修正。鏈接過程主要包括了地址和空間分配、符號決議和重定向。
2.鏈接過程的實現:
使用gcc test.o -o test指令,生成一個test文件
這就是鏈接后的文件,也是一個可執行程序,用./test執行
可以看到最終得到了答案。
總結
以上是生活随笔為你收集整理的C语言——程序的编译+链接(linux+gcc实现过程)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言——整形数据的存储
- 下一篇: Linux调试——gdb调试器的简单使用