c檔案編譯過程

2021-06-12 14:12:26 字數 1328 閱讀 5459

編譯的完整過程:c源程式——預編譯處理(生成.c檔案)——編譯、優化程式(生成.s\.s\.asm檔案)——匯程式設計序(生成.obj\.o\.a\.ko檔案)——鏈結程式(生成.exe\.slf\.axf\.hex檔案)

預處理:將所有的偽指令和特殊符號進行替換,經過替換,生成乙個沒有巨集定義,沒有條件編譯指令,沒有標頭檔案,沒有特殊標示符的輸出檔案,此檔案和源**含義相同,但是內容不同。

1.讀取c程式。對其中的偽指令(以#開頭的指令)和特殊符號進行處理。

偽指令主要包括以下四個方面;

1)巨集定義指令#define,#undef

#undef用來取消先前用#define定義的標示符,如果此標示符先前沒有被定義,則此條指令被忽略,#define定義的巨集一直作用#undef取消,否則一直在作用域內有效

2)條件編譯指令#ifdef,#ifndf,#else,#elseif,#edfif

3)標頭檔案包含指令#include

4)預編譯程式可以識別的一些特殊標示符,如line預編譯程式認為是當前程式的行號。

編譯優化程式:編譯程式所要做的工作就是通過詞法分析和語法分析,再確認所有指令都復合語法規則的基礎上,將其翻譯成等價的中間**或者彙編**。優化處理編譯是系統中比較艱深的技術,和彙編軟體有很大關係。

彙編:彙編過程就是將編譯好的組合語言**翻譯成等價的機器**,對於被編譯的所有原始檔經過這一處理都將得到相應的目標檔案。目標檔案存放的也就是與c源程式等價的機器**。

目標檔案由段組成,一般包含**段和資料段,**段主要是程式指令,資料段用來存放全域性變數和靜態變數,以及一些常量。

庫函式:系統提供的供開發人員開發時呼叫的完成特定功能的函式,庫檔案由軟體提供商的庫函式的結合,一般就是.o的目標**

(1)靜態鏈結

在這種鏈結方式下,函式的**將從其所在地靜態鏈結庫中被拷貝到最終的可執行程式中。這樣該程式在被執行時這些**將被裝入到該程序的虛擬位址空間中。靜態鏈結庫實際上是乙個目標檔案的集合,其中的每個檔案含有庫中的乙個或者一組相關函式的**。

(2) 動態鏈結

在此種方式下,函式的**被放到稱作是動態鏈結庫或共享物件的某個目標檔案中。鏈結程式此時所作的只是在最終的可執行程式中記錄下共享物件的名字以及其它少量的登記資訊。在此可執行檔案被執行時,動態鏈結庫的全部內容將被對映到執行時相應程序的虛位址空間。動態鏈結程式將根據可執行程式中記錄的資訊找到相應的函式**。

對於可執行檔案中的函式呼叫,可分別採用動態鏈結或靜態鏈結的方法。使用動態鏈結能夠使最終的可執行檔案比較短小,並且當共享物件被多個程序使用時能節約一些記憶體,因為在記憶體中只需要儲存乙份此共享物件的**。但並不是使用動態鏈結就一定比使用靜態鏈結要優越。在某些情況下動態鏈結可能帶來一些效能上損害。

BIOS 編譯過程 C檔案到EFI檔案

include efi status efiapi main in efi handle imagehandle,in efi system table systemtable 這個過程就是efi編譯的過程,我們來分析每一步的意義,每乙個命令接收了什麼東西,產出了什麼東西,都要搞清楚。第二步 命令 ...

c編譯過程

編譯的概念 編譯程式讀取源程式 字元流 對之進行詞法和語法的分析,將高階語言指令轉換為功能等效的彙編 再由匯程式設計序轉換為機器語言,並且按照作業系統對可執行檔案格式的要求鏈結生成可執行程式。編譯的完整過程 c源程式 預編譯處理 c 編譯 優化程式 s asm 匯程式設計序 obj o a ko 鏈...

c 編譯過程

編譯過程主要分為 4個過程 1 編譯預處理 預編譯程式完成的工作,可以說成是對源程式的 替換 工作。經過這個過程,生成乙個沒有巨集定義 沒有條件編譯指令 沒有特殊符號的輸出檔案。2 編譯 優化階段 通過詞法分析 語法分析,在確認所有的指令都符合語法規則之後,將其翻譯成等價的中間 或彙編 在c 中,以...