高級(jí)C/C++編譯技術(shù)(典藏版)
定 價(jià):¥89
中 教 價(jià):¥55.18 (6.20折)
庫(kù) 存 數(shù): 0
學(xué)習(xí)如何編寫(xiě)C和C 代碼僅僅是個(gè)開(kāi)始。如果你希望從事系統(tǒng)底層開(kāi)發(fā)工作,或想深入理解操作系統(tǒng)、編譯器及它們之間內(nèi)在的關(guān)聯(lián),成為編程專家,那么就必須充分了解編譯器生成的二進(jìn)制文件(目標(biāo)文件、靜態(tài)庫(kù)、動(dòng)態(tài)庫(kù)和可執(zhí)行文件)的作用和結(jié)構(gòu)。開(kāi)源已經(jīng)在許多方面從根本上改變了軟件的原有面貌,越來(lái)越多的系統(tǒng)開(kāi)始采用或集成開(kāi)源代碼,因此對(duì)每位開(kāi)發(fā)人員來(lái)說(shuō),學(xué)習(xí)和理解這些底層技術(shù)也變得十分重要。本書(shū)深入淺出地講解了構(gòu)建過(guò)程(編譯、鏈接)中的細(xì)節(jié),從多個(gè)角度展示了程序與庫(kù)文件或代碼的集成方法,提出了面向代碼重用和系統(tǒng)集成的軟件架構(gòu)設(shè)計(jì)方法,同時(shí)展示了系統(tǒng)開(kāi)發(fā)過(guò)程中疑難問(wèn)題的解決方案。另外,本書(shū)也是一本C和C 二進(jìn)制文件方面的軟件工程指南,涵蓋中級(jí)和專家級(jí)程序員所需的各方面內(nèi)容和信息。通過(guò)閱讀本書(shū),你將學(xué)到:*構(gòu)建過(guò)程(編譯和鏈接)與裝載過(guò)程的內(nèi)部原理。*靜態(tài)庫(kù)、動(dòng)態(tài)庫(kù)和可執(zhí)行文件的內(nèi)部工作機(jī)制。*面向代碼重用和系統(tǒng)集成的軟件架構(gòu)設(shè)計(jì)方法。*編譯、鏈接與運(yùn)行時(shí)問(wèn)題的排查技巧。*在Linux和Windows平臺(tái)下利用二進(jìn)制文件分析工具進(jìn)行分析的方法。
由于Linux市場(chǎng)份額增加,而且越來(lái)越多的人都將Linux作為其編程環(huán)境,這促使開(kāi)發(fā)人員開(kāi)始關(guān)注Linux編程的相關(guān)問(wèn)題。與在一些封裝良好的平臺(tái)上開(kāi)發(fā)軟件的開(kāi)發(fā)人員不同,在Windows和Mac平臺(tái)上利用IDE和SDK將程序員從一些特定的編程細(xì)節(jié)問(wèn)題中解放出來(lái),Linux開(kāi)發(fā)人員在日常工作中需要將來(lái)自不同項(xiàng)目且編碼風(fēng)格迥異的代碼組合起來(lái),這需要開(kāi)發(fā)人員充分理解編譯器、鏈接器的內(nèi)部工作機(jī)制和程序裝載機(jī)制,以及不同庫(kù)的設(shè)計(jì)細(xì)節(jié)和使用方法。本書(shū)將許多零碎的知識(shí)點(diǎn)進(jìn)行匯總,并討論其中有價(jià)值的內(nèi)容,再通過(guò)一系列精心設(shè)計(jì)的簡(jiǎn)單示例進(jìn)行驗(yàn)證。需要注意的是,我并非計(jì)算機(jī)科學(xué)科班出身。在20世紀(jì)90年代末至今的數(shù)字革命中,我作為電氣工程師供職于硅谷的一家多媒體行業(yè)高新技術(shù)企業(yè),并因此掌握了相關(guān)領(lǐng)域的知識(shí)。希望本書(shū)的主題和內(nèi)容能夠讓更多讀者受益。【讀者對(duì)象】作為一名軟件設(shè)計(jì)實(shí)踐顧問(wèn)(雖然很忙,但我還是非常自豪的),我經(jīng)常會(huì)與不同專業(yè)背景和資歷的人溝通。我經(jīng)常在不同的辦公環(huán)境中工作,因此接觸了許多開(kāi)發(fā)人員(絕大多數(shù)來(lái)自硅谷),這也讓我更加了解了本書(shū)的受眾群體,其中包括以下幾類人群:第一類受眾群體是來(lái)自不同工程領(lǐng)域(電氣工程、機(jī)械、機(jī)器人技術(shù)和系統(tǒng)控制、航天、物理和化學(xué)等領(lǐng)域)的C/C 開(kāi)發(fā)人員,這類人需要在日常工作中通過(guò)編程來(lái)解決問(wèn)題。對(duì)缺乏正規(guī)計(jì)算機(jī)科學(xué)課程和理論教學(xué)的人來(lái)說(shuō),本書(shū)所提供的資料彌足珍貴。第二類受眾群體是具有計(jì)算機(jī)科學(xué)教育背景的初級(jí)程序員。本書(shū)能夠幫助這類人將主修課程中學(xué)到的知識(shí)具體化,并注重實(shí)踐。對(duì)資深工程師而言,將第12~14章的內(nèi)容作為手冊(cè)查閱也很有益。第三類受眾群體是操作系統(tǒng)集成和定制的愛(ài)好者。理解二進(jìn)制文件及其內(nèi)部工作機(jī)制將有助于在解決問(wèn)題的過(guò)程中掃除障礙。不管怎么說(shuō)……就目前就業(yè)市場(chǎng)的情況而言,我認(rèn)為(自2005年左右開(kāi)始)熟悉C/C 語(yǔ)言的復(fù)雜性,甚至是算法、數(shù)據(jù)結(jié)構(gòu)和設(shè)計(jì)模式,對(duì)于找到一份好工作是遠(yuǎn)遠(yuǎn)不夠的。在開(kāi)源盛行的今天,專業(yè)開(kāi)發(fā)人員在日常工作中所編寫(xiě)的代碼越來(lái)越少,取而代之的是將現(xiàn)有代碼集成到項(xiàng)目中。這不僅要求開(kāi)發(fā)人員能夠讀懂其他人編寫(xiě)的代碼(使用不同的代碼風(fēng)格和實(shí)踐),還需要了解如何才能以最好的方式將現(xiàn)有的包(絕大多數(shù)以二進(jìn)制文件/庫(kù)和導(dǎo)出頭文件的形式提供)集成到代碼中。我希望本書(shū)能夠兼具教學(xué)(對(duì)急需這些知識(shí)的讀者而言)和快速查詢的功能(對(duì)分析C/C 二進(jìn)制文件相關(guān)工作的工程師而言)。【為何采用Linux進(jìn)行演示】選擇Linux并非我個(gè)人的偏好。實(shí)際上了解我的人都知道,我過(guò)去是多么喜歡使用Windows作為開(kāi)發(fā)環(huán)境(原本這是我首選的設(shè)計(jì)平臺(tái)),原因是Windows平臺(tái)具有完善的文檔、完美的支持和符合規(guī)范的認(rèn)證組件。我設(shè)計(jì)過(guò)許多專業(yè)化軟件(曾為Palm公司設(shè)計(jì)開(kāi)發(fā)了Windows Mobile平臺(tái)的GraphEdit,其中包含許多復(fù)雜的功能,隨后又開(kāi)發(fā)了多個(gè)媒體格式和DSP分析軟件),當(dāng)時(shí)我對(duì)Windows技術(shù)了如指掌,并感嘆Windows相關(guān)技術(shù)所帶來(lái)的改變。與此同時(shí), Linux的時(shí)代到來(lái)了。有關(guān)Linux的技術(shù)隨處可見(jiàn),而對(duì)開(kāi)發(fā)人員來(lái)說(shuō),也必須順應(yīng)這種趨勢(shì)去學(xué)習(xí)和使用它。Linux軟件開(kāi)發(fā)環(huán)境具有開(kāi)放、透明和簡(jiǎn)單明了的特點(diǎn)。在Linux中,我們可以對(duì)每個(gè)程序設(shè)計(jì)階段進(jìn)行控制。同時(shí),Linux提供了完善的文檔,再加上網(wǎng)絡(luò)上提供的資源,就可以輕松地使用GNU工具鏈。實(shí)際上,由于Linux C/C 開(kāi)發(fā)經(jīng)驗(yàn)可以直接適用于Mac OS平臺(tái)的底層開(kāi)發(fā),因此我最終決定選用Linux/GNU作為本書(shū)所涵蓋的主要開(kāi)發(fā)環(huán)境。別急!Linux與GNU完全是兩回事實(shí)際上,Linux是內(nèi)核,而GNU中包含了Linux內(nèi)核之上的所有軟件。除了GNU編譯器可以在其他操作系統(tǒng)上使用(比如Windows上的MinGW)以外,在絕大多數(shù)情況下,GNU與Linux的關(guān)系其實(shí)非常緊密。為了簡(jiǎn)單起見(jiàn),同時(shí)為了符合一般開(kāi)發(fā)人員對(duì)開(kāi)發(fā)場(chǎng)景的認(rèn)識(shí),特別是為了將Linux與Windows進(jìn)行對(duì)比,本書(shū)將GNU與Linux作為一個(gè)整體,簡(jiǎn)稱為L(zhǎng)inux。【章節(jié)概覽】第1~5章講解的內(nèi)容主要為后續(xù)內(nèi)容做鋪墊。擁有計(jì)算機(jī)科學(xué)背景的讀者可以快速閱讀這些章節(jié)(幸運(yùn)的是,這些章節(jié)的內(nèi)容并不長(zhǎng))。實(shí)際上,任何計(jì)算機(jī)科學(xué)方面的教科書(shū)都會(huì)對(duì)這些內(nèi)容進(jìn)行類似介紹,而且內(nèi)容會(huì)更為詳細(xì)。我個(gè)人推薦由Bryant和OHallaron編寫(xiě)的《深入理解計(jì)算機(jī)系統(tǒng)》(Computer SystemsA Programmers Perspective)一書(shū),原因是該書(shū)對(duì)很多主題都進(jìn)行了非常有條理的梳理和總結(jié)。第6~11章是本書(shū)的核心章節(jié)。為求整體內(nèi)容簡(jiǎn)潔明了,我花費(fèi)了相當(dāng)大的精力,并嘗試使用一些日常生活中常見(jiàn)事物的文字和圖片來(lái)闡述那些最為重要的核心概念。如果你不是計(jì)算機(jī)科學(xué)科班出身,那么有必要先理解這些內(nèi)容。其實(shí)這些章節(jié)是本書(shū)主題的要點(diǎn)。第12~14章主要概括了一些實(shí)踐方面的內(nèi)容,便于讀者快速查找相關(guān)的概念。這些章節(jié)針對(duì)一些特定平臺(tái)的二進(jìn)制文件分
米蘭·斯特瓦諾維奇( Milan Stevanovic ) 資深軟件顧問(wèn),在多個(gè)學(xué)科的工程領(lǐng)域有著豐富的經(jīng)驗(yàn)。他主要從事Linux和Windows平臺(tái)下的多媒體壓縮格式及多媒體框架設(shè)計(jì)工作。他熱衷于開(kāi)源,是avxsynth開(kāi)源項(xiàng)目的主要貢獻(xiàn)者,對(duì)C和C 底層技術(shù)有著深入的研究。
譯者序前言第1章 多任務(wù)操作系統(tǒng)基礎(chǔ) 11.1 一些有用的抽象概念 11.2 存儲(chǔ)器層次結(jié)構(gòu)與緩存策略 21.3 虛擬內(nèi)存 31.4 虛擬地址 51.5 進(jìn)程的內(nèi)存劃分方案 51.6 二進(jìn)制文件、編譯器、鏈接器與裝載器的作用 61.7 小結(jié) 7第2章 程序生命周期階段基礎(chǔ) 82.1 基本假設(shè) 82.2 編寫(xiě)代碼 92.3 編譯階段 112.3.1 基本概念 112.3.2 相關(guān)概念 112.3.3 編譯的各個(gè)階段 122.3.4 目標(biāo)文件屬性 232.3.5 編譯過(guò)程的局限性 242.4 鏈接 262.4.1 鏈接階段 262.4.2 鏈接器視角 312.5 可執(zhí)行文件屬性 332.5.1 各種節(jié)的類型 342.5.2 各種符號(hào)類型 36第3章 加載程序執(zhí)行階段 373.1 shell的重要性 373.2 內(nèi)核的作用 393.3 裝載器的作用 393.3.1 裝載器視角下的二進(jìn)制文件(節(jié)與段) 393.3.2 程序加載階段 403.4 程序執(zhí)行入口點(diǎn) 433.4.1 裝載器查找入口點(diǎn) 433.4.2 _start()函數(shù)的作用 433.4.3 __libc_start_main()函數(shù)的作用 443.4.4 棧和調(diào)用慣例 44第4章 重用概念的作用 464.1 靜態(tài)庫(kù) 464.2 動(dòng)態(tài)庫(kù) 484.2.1 動(dòng)態(tài)庫(kù)和共享庫(kù) 494.2.2 動(dòng)態(tài)鏈接詳解 514.2.3 Windows平臺(tái)中動(dòng)態(tài)鏈接的特點(diǎn) 544.2.4 動(dòng)態(tài)庫(kù)的特點(diǎn) 564.2.5 應(yīng)用程序二進(jìn)制接口 564.3 靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)對(duì)比 574.3.1 導(dǎo)入選擇條件的差異 574.3.2 部署難題 594.4 一些有用的類比 614.5 結(jié)論:二進(jìn)制重用概念所產(chǎn)生的影響 63第5章 使用靜態(tài)庫(kù) 645.1 創(chuàng)建靜態(tài)庫(kù) 645.1.1 創(chuàng)建Linux靜態(tài)庫(kù) 645.1.2 創(chuàng)建Windows靜態(tài)庫(kù) 655.2 靜態(tài)庫(kù)的使用場(chǎng)合 655.3 靜態(tài)庫(kù)設(shè)計(jì)技巧 665.3.1 丟失符號(hào)可見(jiàn)性和唯一性的可能性 665.3.2 靜態(tài)庫(kù)使用禁忌 675.3.3 靜態(tài)庫(kù)鏈接的具體規(guī)則 685.3.4 將靜態(tài)庫(kù)轉(zhuǎn)換成動(dòng)態(tài)庫(kù) 685.3.5 靜態(tài)庫(kù)在64位Linux平臺(tái)上的問(wèn)題 68第6章 動(dòng)態(tài)庫(kù)的設(shè)計(jì):基礎(chǔ)篇 706.1 創(chuàng)建動(dòng)態(tài)庫(kù) 706.1.1 在Linux中創(chuàng)建動(dòng)態(tài)庫(kù) 706.1.2 在Windows中創(chuàng)建動(dòng)態(tài)庫(kù) 726.2 設(shè)計(jì)動(dòng)態(tài)庫(kù) 756.2.1 設(shè)計(jì)二進(jìn)制接口 756.2.2 設(shè)計(jì)應(yīng)用程序的二進(jìn)制接口 796.2.3 控制動(dòng)態(tài)庫(kù)符號(hào)的可見(jiàn)性 826.2.4 完成鏈接需要滿足的條件 946.3 動(dòng)態(tài)鏈接模式 946.3.1 加載時(shí)動(dòng)態(tài)鏈接 956.3.2 運(yùn)行時(shí)動(dòng)態(tài)鏈接 956.3.3 比較兩種動(dòng)態(tài)鏈接模式 98第7章 定位庫(kù)文件 997.1 典型用例場(chǎng)景 997.1.1 開(kāi)發(fā)用例場(chǎng)景 997.1.2 用戶運(yùn)行時(shí)用例場(chǎng)景 1007.2 構(gòu)建過(guò)程中庫(kù)文件的定位規(guī)則 1017.2.1 Linux構(gòu)建過(guò)程中的庫(kù)文件定位規(guī)則 1017.2.2 Windows構(gòu)建過(guò)程中的庫(kù)文件定位規(guī)則 1057.3 運(yùn)行時(shí)動(dòng)態(tài)庫(kù)文件的定位規(guī)則 1097.3.1 Linux運(yùn)行時(shí)動(dòng)態(tài)庫(kù)文件的定位規(guī)則 1107.3.2 Windows運(yùn)行時(shí)動(dòng)態(tài)庫(kù)文件的定位規(guī)則 1147.4 示例:Linux構(gòu)建時(shí)與運(yùn)行時(shí)的庫(kù)文件定位 115第8章 動(dòng)態(tài)庫(kù)的設(shè)計(jì):進(jìn)階篇 1198.1 解析內(nèi)存地址的必要性 1198.2 引用解析中的常見(jiàn)問(wèn)題 1208.3 地址轉(zhuǎn)換引發(fā)的問(wèn)題 1228.3.1 情景1:客戶二進(jìn)制文件需要知道動(dòng)態(tài)庫(kù)符號(hào)地址 1228.3.2 情景2:被裝載的庫(kù)不需要知道其自身符號(hào)地址 1238.4 鏈接器-裝載器協(xié)作 1248.4.1 總體策略 1258.4.2 具體技術(shù) 1268.4.3 鏈接器重定位提示概述 1278.5 鏈接器-裝載器協(xié)作實(shí)現(xiàn)技術(shù) 1288.5.1 裝載時(shí)重定位 1298.5.2 位置無(wú)關(guān)代碼 129第9章 動(dòng)態(tài)鏈接時(shí)的重復(fù)符號(hào)處理 1349.1 重復(fù)符號(hào)的定義 1349.2 重復(fù)符號(hào)的默認(rèn)處理 1379.3 在動(dòng)態(tài)庫(kù)鏈接過(guò)程中處理重復(fù)符號(hào) 1409.3.1 處理重復(fù)符號(hào)問(wèn)題的一般策略 1429.3.2 鏈接器解析動(dòng)態(tài)庫(kù)重復(fù)符號(hào)的模糊算法準(zhǔn)則 1439.4 特定重復(fù)名稱案例分析 1449.4.1 案例1:客戶二進(jìn)制文件符號(hào)與動(dòng)態(tài)庫(kù)ABI函數(shù)沖突 1449.4.2 案例2:不同動(dòng)態(tài)庫(kù)的ABI符號(hào)沖突 1479.4.3 案例3:動(dòng)態(tài)庫(kù)ABI符號(hào)和另一個(gè)動(dòng)態(tài)庫(kù)局部符號(hào)沖突 1519.4.4 案例4:兩個(gè)未導(dǎo)出的動(dòng)態(tài)庫(kù)符號(hào)沖突 1539.5 小提示:鏈接并不提供任何類型的命名空間繼承 161第10章 動(dòng)態(tài)庫(kù)的版本控制 16210.1 主次版本號(hào)與向后兼容性 16210.1.1 主版本號(hào)變更 16210.1.2 次版本號(hào)變更 16310.1.3 修訂版本號(hào) 16310.2 Linux動(dòng)態(tài)庫(kù)版本控制方案 16310.2.1 基于soname的版本控制方案 16310.2.2 基于