Linux程序在預處理、編譯、匯編、鏈接、運行步驟的作用


創建一個hello.c文件,按步驟操作:

一、預編譯 <生成 hello.i文件 >

操作步驟:gcc -E hello.c -o hello.i

1.將所有的#define刪除,並展開所有的宏定義; 

2.處理所有的預編譯指令,例如:#if,#elif,#else,#endif; 

3.處理#include預編譯指令,將被包含的文件插入到預編譯指令的位置; 

4.添加行號信息文件名信息,便於調試; 

5.刪除所有的注釋:// /**/; 

6.保留所有的#pragma編譯指令,因為在編寫程序的時候,我們經常要用到#pragma指令來設定編譯器的狀態或者是指示編譯器完成一些特定的動作。 

生成.i文件。

包括(1)去注釋 (2)宏替換 (3)頭文件展開 (4)條件編譯
二、編譯(高級語言——>匯編語言)<生成hello.s文件>

操作步驟:gcc -S hello.i -o hello.s   

主要作用:1.掃描(詞法分析),2.語法分析,3.語義分析,4.源代碼優化(中間語言生成),5.代碼生成,目標代碼優化。

三、匯編(匯編語言——>二進制文件)<生成hello.o文件>

操作步驟:gcc -c hello.s -o hello.o

主要作用:匯編器是將匯編代碼轉變成可以執行的指令,生成 目標文件。

四、鏈接(生成exe文件)

操作步驟:gcc hello.o -o hello

主要作用:鏈接過程主要包括:地址和空間的分配,符號決議和重定位。

地址和空間:系統給函數、變量分配地址和空間。

符號決議:也可以說地址綁定,分動態鏈接和靜態鏈接,

重定位:假設此時又兩個文件:A,B。A需要B中的某個函數mov的地址,未鏈接前將地址置為0,當A與B鏈接后修改目標地址,完成重定位

五、運行

操作步驟:./hello

主要功能:運行程序


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM