高級 C/C++ 編譯技術 (典藏版) Advanced C and C++ Compiling

Milan Stevanovic

買這商品的人也買了...

商品描述

學習如何編寫C和C++代碼僅僅是個開始。
如果你希望從事系統底層開發工作,或想深入理解操作系統、編譯器及它們之間內在的關聯,
成為編程專家,那麼就必須充分了解編譯器生成的二進製文件(目標文件、靜態庫、動態庫和可執行文件)的作用和結構。
開源已經在許多方面從根本上改變了軟件的原有面貌,越來越多的系統開始採用或集成開源代碼,
因此對每位開發人員來說,學習和理解這些底層技術也變得十分重要。

本書深入淺出地講解了構建過程(編譯、鏈接)中的細節,從多個角度展示了程序與庫文件或代碼的集成方法,
提出了面向代碼重用和系統集成的軟件架構設計方法,同時展示了系統開發過程中疑難問題的解決方案。
另外,本書也是一本C和C++二進製文件方面的軟件工程指南,
涵蓋中級和專家級程序員所需的各方面內容和信息。
通過閱讀本書,你將學到:

*構建過程(編譯和鏈接)與裝載過程的內部原理。
*靜態庫、動態庫和可執行文件的內部工作機制。
*面向代碼重用和系統集成的軟件架構設計方法。
*編譯、鏈接與運行時問題的排查技巧。
*在Linux和Windows平台下利用二進製文件分析工具進行分析的方法。
 

作者簡介

Milan Stevanovic 
資深軟件顧問,在多個學科的工程領域有著豐富的經驗。
他主要從事Linux和Windows平台下的多媒體壓縮格式及多媒體框架設計工作。
他熱衷於開源,是avxsynth開源項目的主要貢獻者,對C和C++底層技術有著深入的研究。

目錄大綱

譯者序
前言
第1章多任務操作系統基礎1
1.1 一些有用的抽象概念1
1.2 存儲器層次結構與緩存策略2
1.3 虛擬內存3
1.4 虛擬地址5
1.5 進程的內存劃分方案5
1.6 二進製文件、編譯器、鏈接器與裝載器的作用6
1.7 小結7

第2章程序生命週期階段基礎8
2.1 基本假設8
2.2 編寫代碼9
2.3 編譯階段11
2.3.1 基本概念11
2.3.2 相關概念11
2.3.3 編譯的各個階段12
2.3.4 目標文件屬性23
2.3.5 編譯過程的局限性24
2.4 鏈接26
2.4.1 鏈接階段26
2.4.2 鏈接器視角31
2.5 可執行文件屬性33
2.5.1 各種節的類型34
2.5.2 各種符號類型36

第3章加載程序執行階段37
3.1 shell的重要性37
3.2 內核的作用39
3.3 裝載器的作用39
3.3.1 裝載器視角下的二進製文件(節與段) 39
3.3.2 程序加載階段40
3.4 程序執行入口點43
3.4.1 裝載器查找入口點43
3.4.2 _start()函數的作用43
3.4.3 __libc_start_main()函數的作用44
3.4.4 棧和調用慣例44

第4章重用概念的作用46
4.1 靜態庫46
4.2 動態庫48
4.2.1 動態庫和共享庫49
4.2.2 動態鏈接詳解51
4.2.3 Windows平台中動態鏈接的特點54
4.2.4 動態庫的特點56
4.2.5 應用程序二進制接口56
4.3 靜態庫和動態庫對比57
4.3.1 導入選擇條件的差異57
4.3.2 部署難題59
4.4 一些有用的類比61
4.5 結論:二進制重用概念所產生的影響63

第5章使用靜態庫64
5.1 創建靜態庫64
5.1.1 創建Linux靜態庫64
5.1.2 創建Windows靜態庫65
5.2 靜態庫的使用場合65
5.3 靜態庫設計技巧66
5.3.1 丟失符號可見性和唯一性的可能性66
5.3.2 靜態庫使用禁忌67
5.3.3 靜態庫鏈接的具體規則68
5.3.4 將靜態庫轉換成動態庫68
5.3.5 靜態庫在64位Linux平台上的問題68

第6章動態庫的設計:基礎篇70
6.1 創建動態庫70
6.1.1 在Linux中創建動態庫70
6.1.2 在Windows中創建動態庫72
6.2 設計動態庫75
6.2.1 設計二進制接口75
6.2.2 設計應用程序的二進制接口79
6.2.3 控制動態庫符號的可見性82
6.2.4 完成鏈接需要滿足的條件94
6.3 動態鏈接模式94
6.3.1 加載時動態鏈接95
6.3.2 運行時動態鏈接95
6.3.3 比較兩種動態鏈接模式98

第7章定位庫文件99
7.1 典型用例場景99
7.1.1 開髮用例場景99
7.1.2 用戶運行時用例場景100
7.2 構建過程中庫文件的定位規則101
7.2.1 Linux構建過程中的庫文件定位規則101
7.2.2 Windows構建過程中的庫文件定位規則105
7.3 運行時動態庫文件的定位規則109
7.3.1 Linux運行時動態庫文件的定位規則110
7.3.2 Windows運行時動態庫文件的定位規則114
7.4 示例:Linux構建時與運行時的庫文件定位115

第8章動態庫的設計:進階篇119
8.1 解析內存地址的必要性119
8.2 引用解析中的常見問題120
8.3 地址轉換引發的問題122
8.3.1 情景1:客戶二進製文件需要知道動態庫符號地址122
8.3.2 情景2:被裝載的庫不需要知道其自身符號地址123
8.4 鏈接器-裝載器協作124
8.4.1 總體策略125
8.4.2 具體技術126
8.4.3 鏈接器重定位提示概述127
8.5 鏈接器-裝載器協作實現技術128
8.5.1 裝載時重定位129
8.5.2 位置無關代碼129

第9章動態鏈接時的重複符號處理134
9.1 重複符號的定義134
9.2 重複符號的默認處理137
9.3 在動態庫鏈接過程中處理重複符號140
9.3.1 處理重複符號問題的一般策略142
9.3.2 鏈接器解析動態庫重複符號的模糊算法準則143
9.4 特定重複名稱案例分析144
9.4.1 案例1:客戶二進製文件符號與動態庫ABI函數衝突144
9.4.2 案例2:不同動態庫的ABI符號衝突147
9.4.3 案例3:動態庫ABI符號和另一個動態庫局部符號衝突151
9.4.4 案例4:兩個未導出的動態庫符號衝突153
9.5 小提示:鏈接並不提供任何類型的命名空間繼承161

第10章動態庫的版本控制162
10.1 主次版本號與向後兼容性162
10.1.1 主版本號變更162
10.1.2 次版本號變更163
10.1.3 修訂版本號163
10.2 Linux動態庫版本控制方案163
10.2.1 基於soname的版本控制方案163
10.2.2 基於