如何向面試官講清楚程序編譯過程

源文件到產生效果是個很複雜的過程
大體步驟分爲編譯和鏈接
你如果只是背,這四點千萬不要忽略
預處理(也稱預編譯,Preprocessing)、編譯(Compilation)、彙編(Assembly)和鏈接(Linking)。
首先是個大的過程,編譯。
編譯分爲預編譯和編譯加彙編
預處理過程中,對源代碼文件中的文件包含(include)、預編譯語句(如宏定義define等)進行分析。接着調用cc1進行編譯,這個階段根據輸入文件生成以.i爲後綴的目標文件。彙編過程是針對彙編語言的步驟,調用as進行工作,一般來講,.S爲後綴的彙編語言源代碼文件和彙編、.s爲後綴的彙編語言文件經過預編譯和彙編之後都生成以.o爲後綴的目標文件

爲了更清晰可見,我們再gcc編譯下更清晰認識到
首先是預編譯
我們假設有這樣一個文件
getopt_exp.c
在進行預編譯後
我們將結果放在res.i文件中
gcc -E getopt_exp.c -o res.i

我們來查看行數發現
在這裏插入圖片描述
可見預編譯後是個龐大的代碼量
接下來就是編譯了
在編譯過程中會進行語法分析 詞義分析 語義分析 符號彙總
編譯階段將C語言轉換成彙編語言 生成 .s文件
在這裏插入圖片描述
我們可以看到這時候代碼量急劇減少,接下來就是我們所謂的彙編階段
彙編就是將彙編指令翻譯成二進制指令形成符號表。 生成.o文件
這個階段,生成目標代碼。
此過程生成ELF格式的目標代碼
在這裏插入圖片描述
接下來就是鏈接過程,生成可執行代碼。鏈接分爲兩種,一種是靜態鏈接,另外一種是動態鏈接。使用靜態鏈接的好處是,依賴的動態鏈接庫較少,對動態鏈接庫的版本不會很敏感,具有較好的兼容性;缺點是生成的程序比較大。使用動態鏈接的好處是,生成的程序比較小,佔用較少的內存。鏈接主要有個過程
1:合併段表,將對應段合併在一起
2:符號表的合併和無符號表的重定位。
在這裏插入圖片描述
完成鏈接後就能得到我們想要的結果啦。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章