程序編譯的過程

hello.c(源程序)是一條高級C語言程序,雖然它是以一種易讀的形式,讓人們?nèi)菀桌斫?。但是,它卻無法直接驅(qū)動硬件CPU直接執(zhí)行。為了我們編寫的hello.c程序可以被執(zhí)行,驅(qū)動硬件電路工作,hello.c程序必須經(jīng)過一些列處理步驟,將源程序轉(zhuǎn)化為可執(zhí)行性的目標(biāo)程序。

而我們知道,機(jī)器語言就是處理器可以直接理解(與生俱來就能理解)的編程語言,機(jī)器語言有時也被叫做原生代碼(Native Code)[1],而機(jī)器語言是一種以“0、1、0、1”的表現(xiàn)形式二進(jìn)制代碼,因此源程序的編譯過程任務(wù)即就是:將以高級語言編寫的程序轉(zhuǎn)換為以二進(jìn)制代碼的可執(zhí)行性目標(biāo)程序。

1.編譯過程的四個階段
源程序到目標(biāo)程序執(zhí)行的四個階段如圖1所示,GCC編譯C源代碼有四個步驟:預(yù)處理—->編譯—->匯編—->鏈接。

image.png

2.預(yù)處理階段(.c—.i)
編譯器將C程序的頭文件編譯進(jìn)來,還有宏的替換,可以用gcc的參數(shù)-E來參看。

命令:unix>gcc –o hello hello.c
作用:將hello.c預(yù)處理輸出hello.i

3 編譯(.i—.s)轉(zhuǎn)換為匯編語言文件
這個階段編譯器主要做詞法分析、語法分析、語義分析等,在檢查無錯誤后后,把代碼翻譯成匯編語言[2]??捎胓cc的參數(shù)-S來參看。
編譯器(ccl)將文本文件hello.i 翻譯成文本文件hello.s, 它包含一個匯編語言程序。
一條低級機(jī)器語言指令。
命令:gcc -S hello.i -o hello.s
作用:將預(yù)處理輸出文件hello.i匯編成hello.s文件

4.匯編階段(.s—.o)得到機(jī)器語言
匯編器as 將hello.s 翻譯成機(jī)器語言保存在hello.o 中(二進(jìn)制文本形式)。

5.鏈接階段
printf函數(shù)存在于一個名為printf.o的單獨預(yù)編譯目標(biāo)文件中。必須得將其并入到hello.o的程序中,鏈接器就是負(fù)責(zé)處理這兩個的并入,結(jié)果得到hello文件,它就是一個可執(zhí)行的目標(biāo)文件。

原文:https://blog.csdn.net/dylandong/article/details/60465718

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一個C/C++文件要經(jīng)過預(yù)處理(preprocessing)、編譯(compilation)、匯編(assembl...
    Mr_Bluyee閱讀 2,751評論 0 0
  • 第一章:編譯和安裝SCons第二章:簡單編譯第三章:編譯相關(guān)的一些事情第四章:編譯和鏈接庫文件第五章:節(jié)點對象第六...
    仙靈兒閱讀 12,346評論 0 3
  • 不記得是昨晚,還是今早,突然想起了汪曾祺早期的一篇文章來,晚上,在翻看一冊影印版的《李義山詩解》時——此書“刊於雍...
    蘿卜閱讀 295評論 0 5
  • 白巖松說,俄羅斯世界杯,除了中國除了足球隊沒去,其他的都去了。 這句話似乎刺到了足協(xié)副主席李毓毅, 19...
    車后座閱讀 345評論 0 0
  • HR的修煉手冊閱讀 88評論 0 0

友情鏈接更多精彩內(nèi)容