1. 程式人生 > >【揭祕VC CRT庫Intel模組】-- 開篇

【揭祕VC CRT庫Intel模組】-- 開篇

        在本部落格開啟時,就有打算寫這塊的衝動,直到現在,直到今晚,突然一股勁讓我開了這個系列,寫下開篇。

        近段時間一直忙於工作,潛下心來做自己的研究也少了很多,每天下班回家都10點多了,很累。一般就洗洗睡覺了,遠遠比不得幾年前的精力和狀態了。看來我得好好調整一下時間,讓時間用在刀刃上。

        切入正題,本系列主要針對vc的crt庫中的intel版本asm原始碼進行逐個剖析,前面已經有大概兩篇文章已經涉及到了這個系列的研究範圍。一篇是《深入C/C++之基於Cookie的安全檢查(VS2005)》,這篇裡面提到了secchk.c這個用於安全檢查的原始檔。另一篇是《【動態分配棧記憶體】之alloca內幕

》,裡面剖析了alloca16.asm和chkstk.asm這兩個原始檔。因此,為了進一步將這類crt原始碼進行剖析,特地開設本系列博文,同時給自己一個對以往的研究進行總結的機會。

        本系列同樣在vs2008(vc9)環境下進行,我對比了一下各個版本vc下的crt,對於這個intel模組下的原始碼差異很小。在之後有碰到差異時,再進行詳細區分。這個intel模組的目錄在vc安裝目錄下的:VC\crt\src\intel目錄裡。這個目錄裡有很多asm原始碼,通過檔名,我想大家都能知道一些常見的函式。當然有一些相對陌生的函式,我們在之後再一步一步研究。另外,可以發現這個目錄下有4個xxx_lib的目錄,它們分別是:dll_lib、mt_lib、xdll_lib和xmt_lib。這幾個資料夾下面有很多.obj和一些lib檔案,想必它們是不同版本的crt中間檔案和lib。的確如此,相對於VC的工程屬性下“C/C++->常規->程式碼生成->執行庫”的設定,dll_lib對應於多執行緒DLL (/MD)

,mt_lib對應於多執行緒(/MT),xdll_lib對應於多執行緒除錯DLL (/MDd),xmt_lib對應於多執行緒除錯(/MTd),不同的執行庫選擇,會連結不同的lib。這裡的4個資料夾裡面的obj分別被編譯到msvcrt.liblibcmt.libmsvcrtd.liblibcmtd.lib中(當然還有其他的lib,這裡不再累述)。這幾個lib位於VC安裝目錄下的VC\lib目錄裡。通過我們的編譯器設定而連結相應的靜態庫。如果你想試驗一下,你可以在選擇前面提到的4種執行庫之後,在連結器的輸入選項卡下,在忽略特定庫選項裡添上對應的lib庫名(如:選擇了/MD執行庫時,忽略msvcrt.lib),你會發現連結會失敗。

        在工作這麼些年的以來,發現很多擁有幾年甚至十多年經驗的cc++程式設計師,對於crt庫的相關設定都會有一絲懼怕,例如在設定了某些執行時庫後,在連結時碰到一些重定義,乃至一大篇的LNK2001錯誤時,就不知所措了。更有甚者,就害怕各種lib之間的連結,害怕dll之間的依賴。我個人認為,VC給出的資訊已經很多很清晰了,關鍵在於平時我們是否用心去觀察,用心去挖掘其中的原委。當你清楚了其中的關係時,當你知曉了crt的相關常見函式時,這些連結錯誤,重定義錯誤就顯得很明瞭了。有種運籌帷幄之中的感覺。不管是crt還是自己寫的動態庫靜態庫,都是大同小異的。

        對於上面提到的種種現象,我想,這也算是我寫這個系列的一個動力吧。很多時候,我們相信crt,相信其優秀,相信其效能。那麼相信的同時,作為一個追根究底,樂於思考的程式設計師來說,我想,肯定會有去研究深入的衝動。我也算是這麼一個人吧。當然,你如果看到這裡,發現這樣做沒什麼必要,或者覺得這是在浪費時間,那我只能認為是每個人的追求不一樣吧,當然這裡的追求沒有高低好壞對錯之分,只是路不同罷了。人活在這個世界上,恐怕連自己都很難說清楚自己到底是要追求什麼,可能是長久的,可能是短暫的,這一切都在於當前的認知是否適合做什麼。扯遠了,回到正題,只想說明一點,本系列的所有文章僅代表我個人觀點。

        最後,歸納一下本系列的相關環境和說明:

                環境:Microsoft Visual Studio 2008

                OS:Microsoft Windows 7

                申明:本系列隻立足於VS2008及windows平臺,無特殊說明,不涉及跨平臺。因此,對於crt的相關研究,例如效能、優化等在無特殊說明時,都只針對於windows平臺,microsoft編譯器。

        有激情肯追求的朋友,一起研究吧。對於大牛們,我只想說:“親,你完全可以略過,如果能提個意見留個腳印,我甚是感謝!” :)

        ****************如需轉載,請註明出處:http://blog.csdn.net/masefee,謝謝**********************

【揭祕VC CRT庫Intel模組】目錄