這些天遇到關於編譯與鏈接的問題,所以根據網上資料寫下了對這個過程進行簡單梳理!
一、編譯過程:
預處理 -->編譯-->彙編
1、預處理:
完成對源程序的“替代”工作,主要對頭文件宏定義,特殊字符處理
2、編譯:
對語法進行差錯,分析是否符合規則,然後翻譯成彙編代碼。
3、彙編:
把 彙編代碼--->目標機器代碼 的過程。
目標代碼通常有兩個段組成:
- 代碼段:該段中包含主要的程序指令,一般可讀可執行不可寫。
- 數據段:存放全局或靜態變量,可讀可寫可執行
二、鏈接過程:
將有關目標文件彼此連接,包括引用的一些庫文件。
按需求分爲兩種:
- 靜態鏈接:將代碼從所在靜態鏈接庫中拷貝到可執行程序中。所以執行在執行的時候,這些代碼將被裝入到該進程的虛擬空間中。
- 動態鏈接:鏈接時只需要在最終可執行程序中記錄下共享對象的名字以及少量登記信息,無需全部拷貝過來。程序運行時,動態鏈接庫內容被映射到運行時相應虛地址空間。
三、gcc分步進行該過程:
Linux下我們使用 gcc編譯器 把以上過程進行了捆綁,該命令一次完成所有工作。
過程 | 命令 | 執行前的文件 | 執行後的文件 | 對應命令 |
---|---|---|---|---|
預處理 | gcc -E | .c/.h | .i | cpp |
編譯 | gcc -S | .i/.h | .s | cc -S |
彙編 | gcc -c | .s | .o | as |
鏈接 | gcc | .o | 可執行程序 | ld |
詳細分析可參考博客: