gcc編譯器如何工作概要描述

2021-05-22 12:20:06 字數 1144 閱讀 9666

gcc編譯器如何工作概要描述

當我們進行編譯的時候,要使用一系列的工具,我們稱之為工具鏈.其中包括:預處理器cpp,編譯器前端gcc/g++,彙編器as,聯結器ld.乙個編譯過程包括下面幾個階段:

(1)預處理。預處理器cpp將對原始檔中的巨集進行展開。

(2)編譯。gcc將c檔案編譯成彙編檔案。

(3)彙編。as將彙編檔案編譯成機器碼。

(4)連線。ld將目標檔案和外部符號進行連線,得到乙個可執行二進位制檔案。

下面以乙個很簡單的test.c來**這個過程。

#definenumber(1+2)

int main()

(1)預處理:

gcc會首先呼叫cpp進行預處理:cpp test.c > test.i

預處理的輸出為檔案test.i。

我們用cat test.i檢視test.i的內容如下:

int main()

我們可以看到,檔案中巨集定義number出現的位置被(1+2)替換掉了,其它的內容保持不變。

(2)gcc將c檔案編譯成彙編檔案。

接下來gcc會執行gcc -s test.i得到的輸出檔案為test.s.

(3)as將彙編檔案編譯成機器碼。

as test.s -o test.o

得到輸出檔案為test.o.

test.o中為目標機器上的二進位制檔案.

用nm檢視檔案中的符號:nm test.o

輸出如下:

00000000 b .bss

00000000 d .data

00000000 t .text

u ___main

u __alloca

00000000 t _main

既然已經是二進位制目標檔案了,能不能執行呢?試一下./test.o,提示cannot execute binaryfile.

原來___main前面的u表示這個符號的位址還沒有定下來,t表示這個符號屬於**段。ld連線的時候會為這些帶u的符號確定位址。

(4)連線。

連線需要指定庫的位置。通常程式中會有很多的外部符號,因此需要指定的位置就會很多。

不過,我們之需要呼叫gcc即可,ld會自己去找這些庫的位置。

gcc test.o > test

就得到了最終的可執行程式了。

gcc編譯器簡介

在linux中選擇gcc編譯器的原因是gcc執行效率高。gcc基本用法 gcc options filename 其中options為編譯選項。例子 執行指令 gcc hello.c 則對hello.c進行編譯,如果程式沒有語法錯誤,則產生可執行檔案a.out gcc預設檔名 執行可執行檔案指令 a...

gcc編譯器(二)

靜態庫 工程在呼叫靜態庫時,複製靜態庫源 加長,不節省程式空間字尾名.a 優點 編譯後不需要再依賴庫 以空間換時間 動態庫 工程建立對映關係,每次呼叫都需要去庫中載入,字尾名為.so 共享庫 程式輕便,便於公升級。小tips 所有程式執行都在記憶體中,硬碟只能儲存程式。靜態庫的建立 gcc c 原始...

GCC編譯器學習

不同的平台如x86和arm,一段程式跑起來到最下面會轉成彙編,彙編要轉成機器碼,機器碼會由於硬體平台不同而不同。有時候要程式設計序在arm上跑,必須針對arm寫程式,但是在arm上寫程式很麻煩 沒有很好的開發工具 所以我們就在x86平台上 windows 上把程式寫好,但是編譯的時候告訴它我們要執行...