面試題總結之程序編譯過程

前言

請講一下linux如何源文件逐步編譯成可執行文件。

解答

首先先上圖對編譯的整個過程有個感性的認識,然後再逐步分析各個過程。
以hello.c 程序爲例

# include <stdio.h>
main{
    printf("hello\n");
}

這裏寫圖片描述

一個.c源程序需要經過預處理器生成.i文件,再經過編譯器生成.s文件,再經過彙編器生成可重定位目標文件.o文件,再與其他.o文件經過鏈接器生成最終的可執行目標程序。

  1. 預處理階段。主要是處理源文件中以“#”開頭的預編譯指令。

    • 刪除#define並展開宏
    • 處理所有條件預編譯指令,如#if, #ifdef, #endif
    • 插入頭文件到“#include”處
    • 刪除所有註釋
    • 添加行號和文件名標識,以便編譯時編譯器產生調試用的行號信息
    • 保留所有#pragma編譯指令。
  2. 編譯階段。將預處理得到的預處理文件進行語法分析,詞法分析,語義分析,優化後,生成彙編代碼文件(彙編語言源程序)。
  3. 彙編階段。利用匯編程序(彙編器)將彙編語言源程序轉換成機器指令序列(機器語言程序)。
  4. 鏈接階段。將多個可重定位的目標文件.o合併以生成可執行文件,其可以被加載到內存中,由系統執行。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章