最近有幸閱讀了《高級C/C++編譯技術》深受啓發,該書深刻淺出地講解了構建過程(編譯、連接)中的各類細節,從多個角度展現了程序與庫文件或代碼的集成方法,提出了面向代碼複用和系統集成的軟件架構設計方法,以及系統開發過程當中疑難問題的解決方案。
如下將回頭記錄下其中的關鍵要點,以便後面查閱。
(1)代碼節:供CPU執行的機器指令碼(.text節)編程
(2)數據節:供CPU操做的數據,一般來講,初始化數據(.data)、未初始化數據(.bss)、和只讀數據(.rdata)會保存在份量的節中架構
(3)堆:動態內存分配的區域編程語言
(4)棧:爲各個函數提供獨立的存儲空間函數
(5)最上層部分屬於內核區域,特定進程的環境變量就存放在該區域佈局
編譯的目的就是將高級語言轉換爲機器能夠識別和執行的機器語言(彙編或二進制),主要過程包括:優化
(1)預處理:將#incldue關鍵字標識的含有定義的文件包含到源代碼文件中、將#define語句指定的值抓換爲常量、在代碼中調用宏的位置將宏定義轉換爲代碼、根據#if/#elif和#endif指令的位置包含或排除特定部分的代碼架構設計
(2)語言分析:將代碼轉換爲更易於處理的形式(刪除註釋和沒必要要的空格,以及從文本中提取符號等操做),檢查程序是否知足編程語言的語法規則。包括詞法、語法和語義分析設計
(3)彙編階段調試
(4)優化階段:將程序的寄存器使用率最小化,預測出實際上不須要執行的代碼,並將其刪除blog
(5)代碼生成階段
鏈接過程的輸入是目標文件的集合,其中由編譯階段預先生成,每一個目標文件能夠被看做單個的源代碼的二進制存儲版本,須要爲程序內存映射提供各類各樣的節(代碼,初始化數據,未初始化數據,調試信息等)。鏈接器的最終任務是將獨立的節組合成最終的程序內存映射節,與此同時解析全部的引用,爲不一樣部分的代碼間創建關聯,使得程序稱爲一個總體。
(1)重定位:完成內存因素各行
(2)解析引用:檢測拼接到程序內存映射中的節,找出哪些部分代碼產生了外部調用,計算該引用的精確地址,將機器指令中的僞地址替換成程序內存映射的實際地址