linux 編譯程式的四個過程

2021-10-18 09:51:54 字數 1087 閱讀 9008

linux 編譯程式的過程與c/c++程式編譯過程類似,只是使用的命令或實現的方法不一樣(環境平台不一樣),但是總體框架一樣。

一、預編譯

命令是gcc -e main.c -o main.o 假設當前要編譯的檔案是main.c;

1、將所有的#define刪除,並展開所有的巨集定義;

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

3、處理#include預編譯指令,將被包含的檔案插入到預編譯指令的位置;

4、新增行號資訊檔名標識,便於除錯;

5、刪除所有的注釋;

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

7、生成.i檔案。

包括去注釋 ,巨集替換 ,標頭檔案展開,條件編譯,經編譯後的.i檔案不包含任何巨集定義,因為所有的巨集已經被展開,並且包含的檔案已經被插入到.檔案中。

二、編譯:c語言——》彙編

命令是:gcc -s main.i -o main.s

1、掃瞄,語法分析,語義分析,源**優化,目標**生成,目標**優化;

2、生成彙編**;

3、彙總符號;

4、生成.s檔案

三、彙編:彙編——》二進位制

命令是:gcc -c main.s -o main.o

1、根據彙編指令和特定平台,把彙編指令翻譯成二進位制形式;

2、合併各個section,合併符號表;

3、生成.o檔案。

四、鏈結

1、合併各個.obj檔案的section,合併符號表,進行符號解析;

2、符號位址重定位;

3、生成可執行檔案;

五、總結:

無論是linux系統平台還是其它的系統平台,整體的編譯流程幾乎都是一樣的,整體流程如下圖(便於理解)。

linux 編譯程式的四個過程

一 預編譯 他的命令是gcc e main.c o main.o 假設當前要編譯的檔案是main.c 1.將所有的 define刪除,並展開所有的巨集定義 2.處理所有的預編譯指令,例如 if,elif,else,endif 3.處理 include預編譯指令,將被包含的檔案插入到預編譯指令的位置 ...

程式編譯的四個過程

hello.c 源程式 是一條高階c語言程式,雖然它是以一種易讀的形式,讓人們容易理解。但是,它卻無法直接驅動硬體cpu直接執行。為了我們編寫的hello.c程式可以被執行,驅動硬體電路工作,hello.c程式必須經過一些列處理步驟,將源程式轉化為可執行性的目標程式。而我們知道,機器語言就是處理器可...

GCC編譯程式時的四個階段說明!

在使用gcc進行程式的編譯時通常要經歷四個階段 通常指的是從源程式到可執行的二進位制 這整個過程 一些以hello.c為例來說明這四個階段。hello.c includeint main gcc的四個階段如下 1.預處理階段 2.編譯階段 3.彙編階段 4.鏈結階段 四個階段的詳細資訊如下 1.預處...