c語言實現從源文件從文本到可執行文件經歷的過程

源文件從文本到可執行文件經歷的過程

從 .c文件到 .exe文件

gcc hello.c -o hello.exe

源文件( -E)  預處理文件 (-S) 匯編文件 (-c) 目標文件 ( 無)可執行文件

hello.c–預處理–hello.i–編譯–hello.s—匯編–hello.o–鏈接–hello.exe

預處理

gcc -E hello.c -o hello.i

1.頭文件展開 —不檢查語法錯誤,可以展開任意文件

2.宏定義—將宏名替換為宏值,不檢查語法錯誤

3.替換註釋—變成空行

4.展開條件編譯—根據條件來展開指令

編譯

gcc -S hello.i -o hello.s

1.將c程序翻譯為匯編指令

2.逐行檢查語法錯誤–整個編譯4步中最耗時間的過程

匯編

gcc -c hello.s -o hello.o

1.將匯編指令翻譯成對應的二進制編碼

鏈接

gcc hello.o -o hello.exe

1.數據段合並

2.數據地址回填

3.庫引入

在這裡插入圖片描述

寄存器、緩存、內存三者關系

cpu計算時,先預先把要用的數據從硬盤督導內存,然後再把即將要用的數據讀到寄存器中。緩存能夠提高數據的讀取速度。

集成開發環境 IDE

用於提供程序開發的應用程序,一般包括編輯器、編譯器、調試器和用戶界面工具。

源程序如何到可執行程序

源程序(源代碼)是指按照一定的程序設計語言規范編寫的未經過編譯的文本文件,是具有可讀性的計算機語言指令。可以比作自己手寫的程序代碼。

可執行程序(Executable Program,EXE file)是可以在操作系統存儲空間中浮動定位的二進制可執行程序。一般軟件安裝後會生成可執行文件,可以直接加載到內存中,並又操作系統加載並執行。

以 C 語言為例,自己編寫的源代碼文件擴展名為 c,這個 c 文件就是源文件。

從源文件到可執行文件一般需要經過幾個步驟:預處理->編譯->匯編->鏈接這四個過程。

  • 預處理:預處理相當於根據預處理命令將源代碼轉換為新的 c 程序,不過通常以 i 為擴展名。
  • 編譯:將得到的 i 文件翻譯成匯編代碼,通常以 s 為擴展名。
  • 匯編:將匯編文件翻譯為機器指令,並打包成可重定位目標程序的 o 文件。
  • 鏈接:將引用的其它 o 文件加到匯編後的 o 文件中,處理後得到最終的可執行文件。

這裡首先在 linux 操作系統中編寫源代碼,並命名為 hello.c,內容如下:

#include <stdio.h>
int main()
{
    printf("Hello world!\n");
    return 0;
}

一個很簡單的源代碼,但是這樣的源代碼如果不是在集成開發環境(Integrated Development Environment,IDE)中是不能夠直接點擊執行的,需要經過一系列的操作,具體為:

# 預處理
gcc -E hello.c -o hello.i
# 編譯
gcc -S hello.i -o hello.s
# 匯編
gcc -c hello.s -o hello.o
# 鏈接
gcc hello.o -o hello

經過以下操作後,就能夠發現在 hello.c 文件同級目錄中出現瞭文件 hello.i,hello.s,hello.o,hello。可知文件 hello 即為可執行程序,我們在終端中輸入下方的指令,就能夠看到最後的輸出結果。

./hello

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: