C語言編譯、連結過程
阿新 • • 發佈:2019-02-02
這些天遇到關於編譯與連結的問題,所以根據網上資料寫下了對這個過程進行簡單梳理!
一、編譯過程:
預處理 -->編譯-->彙編
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 |
詳細分析可參考部落格: