C原始檔到可執行檔案的過程

2021-07-14 18:21:27 字數 2217 閱讀 2507

一、c原始檔到可執行檔案共經歷了4個過程。在使用gcc編譯程式時,編譯過程可以被細分為四個階段,包括預處理、編譯、彙編、鏈結

1、預處理

在預處理階段,編譯器主要作載入標頭檔案、巨集替換、條件編譯的作用。一般處理帶「#」的語句。

我們可以通過gcc 的 -e 選項進行檢視,如下所示:

[root@localhost 0001]#gcc -e main.c -o main.i
編譯器將main.c預處理結果輸出 main.i 檔案。

2、編譯

在編譯過程中,編譯器主要作語法檢查和詞法分析。我們可以通過使用 -s 選項來進行檢視,該選項預處理之後的結果翻譯成彙編**。如下所示:

[root@localhost 0001]# gcc –s main.i
編譯器將預處理輸出檔案main.i 檔案編譯成main.s 檔案。

3、彙編

在彙編過程中,編譯器把彙編**轉化為機器**。我們可以通過-c 選項來進行檢視,如下所示:

[root@localhost 0001]# gcc –c main.s
編譯器將main.s 檔案轉化為main.o 檔案。

4、鏈結

鏈結就是將目標檔案、啟動**、庫檔案鏈結成可執行檔案的過程,這個檔案可被載入或拷貝到儲存器執行。我們可以通過gcc main.o檢視檔案,

如下所示:

[root@localhost 0001]# gcc –o main.o
編譯器將輸出檔案main.o 鏈結成最終可執行檔案a.out

鏈結可以執行與編譯時(源**被翻譯成機器**時),也可以執行與載入時(在程式被載入器載入到儲存器並執行時),甚至執行與執行時,由應用程式來執行。在現代系統中,鏈結是由鏈結器自動執行的。

a.  

靜態鏈結器

靜態鏈結器以一組可重定位目標檔案和命令列引數作為輸入,生成乙個完全鏈結的可以載入和執行的可執行目標檔案作為輸出。

(1)符號解析:目標檔案定義和引用符號。符號解析的目的在於將每個符號引用和乙個符號定義聯絡起來。

(2)重定位:編譯器和彙編器生成從位址零開始的**和資料節。鏈結器通過把每個符號定義和乙個儲存器位置聯絡起來,然後修改所有對這些符號的引用,使得他們執行這個儲存位置,從而重定位這些節。

b.  動態鏈結器

動態鏈結方式下,函式的定義在動態鏈結庫或共享物件的目標檔案中。

在編譯的鏈結階段,動態鏈結庫只提供符號表和其他少量資訊用於保證所有符號引用都有定義,保證編譯順利通過。動態鏈結器鏈結程式在執行過程中根據記錄的共享物件的符號定義來動態載入共享庫,然後完成重定位。

在此可執行檔案被執行時,動態鏈結庫的全部內容將被對映到執行時相應程序的虛位址空間。動態鏈結程式將根據可執行程式中記錄的資訊找到相應的函式**。  

目標檔案

有三種形式:

1> 可重定位的目標檔案:

包含二進位制**和資料,其形式可以再編譯時與其他可定位目標檔案合併起來,建立乙個可執行目標檔案。

2> 可執行目標檔案:

包含二進位制**和資料,其形式可以被直接拷貝到儲存器並執行。

3> 共享目標檔案:

一種特殊的可重定位目標檔案,可以再載入或執行時,被動態地夾在到儲存器並執行。

編譯器和彙編器生成可重定位目標檔案(包括共享目標檔案),鏈結器生成可執行目標檔案。

gcc優化的方式:

1.  -o0:無優化(預設)。

2.  -o1:使用能減少目標檔案大小以及執行時間並且不會使編譯時間明顯增加的優化.在編譯大型程式的時候會顯著增加編譯時記憶體的使用。

3.  -o2: 包含-o1的優化並增加了不需要在目標檔案大小和執行速度上進行折衷的優化.編譯器不執行迴圈展開以及函式內聯.此選項將增加編譯時間和目標檔案的執行效能。(一般優化到-o2就可以了)

4.  -os:專門優化目標檔案大小,執行所有的不增加目標檔案大小的-o2優化選項.並且執行專門減小目標檔案大小的優化選項。

5.  -o3: 開啟所有-o2的優化選項並且增加 -finline-functions, -funswitch-loops,-fpredictive-commoning, -fgcse-after-reload and -ftree-vectorize優化選項。

從原始檔到可執行檔案

建立對於問題思考的能力,培養自己的程式設計思想。原始檔 目標檔案 可執行檔案 原始檔 用偏日常化的語言進行編寫。c cpp 目標檔案 由計算機可識別的二進位制 構成,決定了程式執行的基礎。obj o 可執行檔案 可以執行為程式的檔案。exe out 過程 編譯 編譯過程包括 預處理 標頭檔案 巨集定...

c原始檔到執行檔案的編譯過程

源程式 預編譯中間檔案 彙編檔案 目標檔案 可執行檔案.我們平常執行程式時,只是在終端下直接收入gcc test o test 就生成了可執行檔案,或者直接輸入 gcc test生成a.out可執行檔案,其實計算機是做了好幾步工作的.底下我們分解下 第一步 預處理 gcc e test.c o te...

原始檔 目標檔案和可執行檔案

1.原始檔 存放程式 的檔案,即我們編輯 的檔案,稱為源 檔案。c語音源程式檔案的擴充套件名為 c 源 檔案是相對目標檔案和可執行檔案而言的 一般使用高階語言寫出來的。2.目標檔案 源 經過編譯所得到的二進位制 稱為目標檔案。目標檔案的擴充套件名為 obj windows 或 o linux 目標檔...