C語言生成可執行檔案的過程

2021-10-19 10:42:01 字數 1475 閱讀 9403

今天用gcc編譯器為大家演示一下c語言的編譯過程

首先,我們將貼上我們樸實無華的源**

由.c --生成–> .o檔案

通過 gcc -e main.c -o main.i 執行c語言的預編譯過程,生成main.o檔案

讓我們懷著敬畏的心情瞧一瞧生成的main.o檔案是啥樣子

(因為篇幅原因,上面截圖只展示原檔案的幾十分之一的**)

可以發現最下面是我們的源**部分,也就是main函式,那麼,main函式上面的幾千行**都是什麼東西呢?

其實啊,那是我們的#include , 即是我們定義的巨集展開的樣子

千萬別小看這個檔案,它可是可以直接執行的

如果有神探的話,可以發現,我上面那個main函式是有語法錯誤的

我的main函式是這樣的

int

intmian()

聰明的你們可以得出乙個什麼結論呢?

在預編譯過程中是不會進行語法檢查的,只會單純的將我們定義的巨集進行展開

由.i檔案生成.s彙編檔案

gcc -s main.i -o main.s

這一步我趕緊偷偷將語法改正過來,因為有了語法檢查嘍(其實也是必然的,因為有語法錯誤怎麼能編譯為正確的彙編**呢)

gcc -c main.s -o main.o

我們採用file命令檢視一下這個目標檔案

發現這個檔案是mach-o型別的,什麼是mach-o呢?

雖然macos擁有著unix上的很多特性,但是並沒有採用unix上可執行檔案elf(excutable link format)格式, 它採用了mach-o作為它的可執行檔案的格式, 哦,所以說,它其實就是乙個mac平台上的可執行檔案, 類似於unix的elf和win的pe

但是呢,它還沒有進行鏈結,例如我們main函式中引用的printf的真正記憶體位址它還是沒有的,所以,並不是乙個真正意義上的可執行檔案

激動。。。終於到了最後一步了

gcc -v main.o -o main 生成我們的可執行檔案

我們雙擊一下這個檔案,就可以發現這個檔案可以正常執行了,是不是非常四高一呢?

生成可執行檔案過程

c語言編譯全過程 編譯的概念 編譯程式讀取源程式 字元流 對之進行詞法和語法的分析,將高階語言指令轉換為功能等效的彙編 再由匯程式設計序轉換為機器語言,並且按照作業系統對可執行檔案格式的要求鏈結生成可執行程式。編譯的完整過程 c源程式 預編譯處理 c 編譯 優化程式 s asm 匯程式設計序 obj...

Linux下C語言生成可執行檔案的過程

在當前目錄下建立乙個c原始檔並開啟 touch test.c gedit test.c 直接編譯 gcc test.c o test分步驟編譯 1 預處理 gcc e test.c o test.i 在當前目錄下會多出乙個預處理結果檔案 test.i,開啟 test.i 可以看到,在 test.c ...

C C 生成可執行檔案過程

編譯的概念 編譯程式讀取源程式 字元流 對之進行詞法和語法的分析,將高階語言指令轉換為功能等效的彙編 再由匯程式設計序轉換為機器語言,並且按照作業系統對可執行檔案格式的要求鏈結生成可執行程式。編譯的完整過程 c源程式 預編譯處理 c 編譯 優化程式 asm s 匯程式設計序 obj o a 鏈結程式...