1. 程式人生 > >Linux下如何將原始檔逐步編譯成目標檔案的過程

Linux下如何將原始檔逐步編譯成目標檔案的過程

前言

請講一下linux如何原始檔逐步編譯成可執行檔案。

解答

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

# include <stdio.h>
main{
    printf("hello\n");
}
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

這裡寫圖片描述

一個.c源程式需要經過前處理器生成.i檔案,再經過編譯器生成.s檔案,再經過彙編器生成可重定位目標檔案.o檔案,再與其他.o檔案經過連結器生成最終的可執行目標程式。

  1. 預處理階段。主要是處理原始檔中以“#”開頭的預編譯指令。

    • 刪除#define並展開巨集
    • 處理所有條件預編譯指令,如#if, #ifdef, #endif
    • 插入標頭檔案到“#include”處
    • 刪除所有註釋
    • 新增行號和檔名標識,以便編譯時編譯器產生除錯用的行號資訊
    • 保留所有#pragma編譯指令。
  2. 編譯階段。將預處理得到的預處理檔案進行語法分析,詞法分析,語義分析,優化後,生成彙編程式碼檔案(組合語言源程式)。
  3. 彙編階段。利用匯程式設計序(彙編器)將組合語言源程式轉換成機器指令序列(機器語言程式)。
  4. 連結階段。將多個可重定位的目標檔案.o合併以生成可執行檔案,其可以被載入到記憶體中,由系統執行。