Linux 預編譯 編譯 彙編 鏈結過程

2021-10-03 21:27:16 字數 1218 閱讀 1875

當我們拿到乙個.cpp的檔案,我們看到它的**,但我們又是知道它是怎樣執行的?我們都知道我們所看到的**都是高階語言。但計算機底層只能識別像0,1這樣的低階語言,所以這也是乙個將c/c++**轉成組合語言然後再變成機器語言的過程。

具體可分為預編譯、編譯、彙編、鏈結四個過程。

一、在liunx中這四個階段的具體命令如下:

1、預編譯:像stdio.h這樣的標頭檔案被翻譯器cpp翻譯成.i檔案

gcc -e hello.c -o hello.s

2、編譯:這個過程是整個程式最核心的部分,也是最複雜的部分

gcc -s hello.i -o hello.s

3、彙編:彙編器將彙編**轉變成機器可以執行的指令

gcc -c hello.c -o hello.c

二、下面我們具體來分析一下這四個過程都進行了哪些工作

1、預編譯

(1)將#include預編譯指令進行處理展開,將所包含的檔案插入到預編譯指令的位置。

(2)將#define進行替換,展開所有巨集定義

(3)刪除#if、#endif.

(4)刪除所有注釋,//、/**/;

(5)新增行號和檔案標識。

(6)保留所有#pragma指令。

(7)生成.i檔案。

2、編譯

(1)詞法分析

(2)語法分析

(3)語義分析

(4)**糾錯

(5)生成彙編指令

(6)生成.s檔案

3、彙編

(1)將彙編指令翻譯成二進位制

(2)合併符號表

(3)生成.o檔案

4、鏈結

(1)符號重定位

(2)分配位址和空間,找到對應的虛擬記憶體空間

(3)符號解析

二、以下為4g虛擬記憶體空間的布局

三、各字段的說明

.data:儲存的是那些已經初始化了的全域性靜態變數和區域性靜態變數。

.bss:存放的是未初始化的全域性變數和區域性靜態變數,像x=0也認為是未初始化的變數。

.text:**會被存放到.text段。

.rodata:存放的是唯讀資料,一般是程式裡面的唯讀(如const修飾的變數)和字元常量。

預編譯 編譯 彙編 鏈結過程

將源 或者標頭檔案經過預編譯成乙個.i檔案。例如c 副檔名是.cpp,標頭檔案的副檔名可能是.hpp,預編譯後的副檔名是.i 預編譯的過程相當於下面的命令 對c語言檔案的處理 gcc e 原始檔 o目標檔案 對c 語言的檔案的處理 g gcc e 原始檔 o目標檔案 例如 gcc e hello.c...

程式的預編譯,編譯,彙編,鏈結過程

預編譯過程主要處理那些源 檔案中的以 開始的預編譯指令。比如 include define 等,主要處理規則如下 1 將所有的 define 刪除,並且展開所有的巨集定義。2 處理所有條件預編譯指令,比如 if ifdef elif else endif 3 處理 include 預編譯指令,將被包...

預編譯,編譯,彙編,鏈結

2.編譯的工作內容 3.彙編的工作內容 4.鏈結器的工作內容 參考 include int main 使用gcc編譯器 gcc hello.c a.out a.out 含義是 assembler output 即 彙編輸出 上述過程可以分解為四個步驟 1.預處理 prepressing gcc e ...