高級C/C++編譯技術之讀書筆記(一)之編譯/連接

                                                                                    

  最近有幸閱讀了《高級C/C++編譯技術》深受啓發,該書深刻淺出地講解了構建過程(編譯、連接)中的各類細節,從多個角度展現了程序與庫文件或代碼的集成方法,提出了面向代碼複用和系統集成的軟件架構設計方法,以及系統開發過程當中疑難問題的解決方案。
  如下將回頭記錄下其中的關鍵要點,以便後面查閱。

本節思惟導圖

  

1. 計算機體系結構抽象

  

2. 進程內存映射佈局

(1)代碼節:供CPU執行的機器指令碼(.text節)編程

(2)數據節:供CPU操做的數據,一般來講,初始化數據(.data)、未初始化數據(.bss)、和只讀數據(.rdata)會保存在份量的節中架構

(3)堆:動態內存分配的區域編程語言

(4)棧:爲各個函數提供獨立的存儲空間函數

(5)最上層部分屬於內核區域,特定進程的環境變量就存放在該區域佈局

3. 編譯階段

  編譯的目的就是將高級語言轉換爲機器能夠識別和執行的機器語言(彙編或二進制),主要過程包括:優化

(1)預處理:將#incldue關鍵字標識的含有定義的文件包含到源代碼文件中、將#define語句指定的值抓換爲常量、在代碼中調用宏的位置將宏定義轉換爲代碼、根據#if/#elif和#endif指令的位置包含或排除特定部分的代碼架構設計

(2)語言分析:將代碼轉換爲更易於處理的形式(刪除註釋和沒必要要的空格,以及從文本中提取符號等操做),檢查程序是否知足編程語言的語法規則。包括詞法、語法和語義分析設計

(3)彙編階段調試

(4)優化階段:將程序的寄存器使用率最小化,預測出實際上不須要執行的代碼,並將其刪除blog

(5)代碼生成階段

4. 連接階段

  鏈接過程的輸入是目標文件的集合,其中由編譯階段預先生成,每一個目標文件能夠被看做單個的源代碼的二進制存儲版本,須要爲程序內存映射提供各類各樣的節(代碼,初始化數據,未初始化數據,調試信息等)。鏈接器的最終任務是將獨立的節組合成最終的程序內存映射節,與此同時解析全部的引用,爲不一樣部分的代碼間創建關聯,使得程序稱爲一個總體。

  (1)重定位:完成內存因素各行

  (2)解析引用:檢測拼接到程序內存映射中的節,找出哪些部分代碼產生了外部調用,計算該引用的精確地址,將機器指令中的僞地址替換成程序內存映射的實際地址

相關文章
相關標籤/搜索