本文參考了博客,其地址如下:https://blog.csdn.net/a3192048/article/details/90143629
源文件生成可執行文件的過程總共是經歷了預處理、編譯、匯編、鏈接四個過程。
源程序(source code)→預處理器(preprocessor)→編譯器(compiler)→匯編程序(assembler)→目標程序(object code)→連接器(鏈接器,Linker)→可執行程序(executables
1.預處理——生成 .i 文件
主要作用:
- 刪除 #define ,展開所有宏定義
- 處理條件預編譯
- 處理#include,將頭文件插入對應位置
- 刪除所有注釋
- 添加行號和文件標識符,用於顯示調試信息:錯誤或警告的位置
- 保留 #pragma 編譯器指令。設定編譯器狀態;指示編譯器完成一些特定的動作
2.編譯——生成匯編代碼文件 .s
對預處理后的文件進行語法分析,詞法分析,語義分析,符號匯總,然后生成 .s 文件,得到的是匯編代碼。
3.匯編——生成二進制目標文件 .o
將匯編代碼轉成二進制文件。另外,會形成符號表,給這些符號分配虛擬地址。
4.鏈接——生成默認 a.out
把二進制文件鏈接成一個可執行的指令
鏈接所完成的任務是合並段表,然后把符號表合並並且對符號表進行重定位。
所謂合並段表,源代碼編譯生成的 a.out 會包含很多段,數據段,文本段,bss段等,編譯過程中,不同的數據會對應到不同的段中, 在 .o 文件中就已經有了分段
所謂符號表合並和重定位是說最后只有一個符號表,這個符號表是由前面匯編形成的多個符號表進行合並。在這里不在同一個符號表的符號,要對他們進行重定位。