http://blog.jobbole.com/96225/#compiler_chs
.bss: BSS全稱為Block Started by Symbol(或者block storage segment)。在采用段式內(nèi)存管理的架構(gòu)中甸祭,BSS 段(bss segment)通常是指用來(lái)存放程序中未初始化的全局變量的一塊內(nèi)存區(qū)域。BSS段屬于靜態(tài)內(nèi)存分配。
.data: 表示數(shù)據(jù)段(data segment),通常用來(lái)存放程序中已初始化的全局變量的一塊內(nèi)存區(qū),也屬于靜態(tài)內(nèi)存分配
.text: 表示代碼段(text segment),通常用來(lái)存放程序執(zhí)行代碼的一塊內(nèi)存區(qū),這部分區(qū)域的大小在程序運(yùn)行前就已經(jīng)確定饵史,并且內(nèi)存區(qū)屬于只讀,代碼段中也可能包含少量的只讀常數(shù)變量胜榔,例如字符串常量等胳喷。
COM: 全稱common段。在《程序員的自我修養(yǎng)》一書(shū)中夭织,指出吭露,如果全局變量初始化的值不為0,則保存在data段尊惰,值為0讲竿,則保存在bss段,如果沒(méi)有初始化弄屡,則保存在common段题禀。當(dāng)變量為static,且未初始化時(shí)放在bss段膀捷,否則放在com段迈嘹。
靜態(tài)庫(kù):在UNIX系統(tǒng)中,一般使用 ar 命令生成靜態(tài)庫(kù)全庸,并以 .a 作為文件擴(kuò)展名秀仲,”lib”作為文件名前綴,鏈接時(shí)壶笼,使用”-l”選項(xiàng)神僵,其后跟著庫(kù)的名稱,用于告訴鏈接器鏈接時(shí)所需要的庫(kù)覆劈,這時(shí)無(wú)需加前綴和擴(kuò)展名(例如保礼,對(duì)于名為”libfred.a”的靜態(tài)庫(kù),傳遞給鏈接器參數(shù)為”-lfred”)墩崩。在Windows平臺(tái)上,靜態(tài)庫(kù)的擴(kuò)展名為 .LIB侯勉。
共享庫(kù):共享庫(kù)(shared libraries)鹦筹,其擴(kuò)展名在 Unix 系統(tǒng)中為 .so,在 Windows 系統(tǒng)中為 .dll址貌,在Mac OSX系統(tǒng)中為.dylib铐拐。對(duì)于這類庫(kù)而言徘键,通常,鏈接器沒(méi)有必要將所有的符號(hào)都關(guān)聯(lián)起來(lái)遍蟋,而是貼上一個(gè)“我欠你(IOU)”這樣的標(biāo)簽吹害,直到程序真正運(yùn)行時(shí)才對(duì)貼有這樣標(biāo)簽的內(nèi)容進(jìn)行處理。當(dāng)鏈接器發(fā)現(xiàn)某個(gè)符號(hào)的定義在共享庫(kù)中虚青,那么它不會(huì)把這個(gè)符號(hào)的定義加入到最終生成的可執(zhí)行文件中它呀,而是將該符號(hào)與其對(duì)應(yīng)的庫(kù)名稱記錄下來(lái)(保存在可執(zhí)行文件中)。
靜態(tài)庫(kù)與共享庫(kù)的區(qū)別:對(duì)于共享庫(kù)棒厘,當(dāng)程序開(kāi)始運(yùn)行時(shí)纵穿,操作系統(tǒng)會(huì)及時(shí)地將剩余的鏈接工作做完以保證程序的正常運(yùn)行(在 main 函數(shù)開(kāi)始之前,有一個(gè)小型的鏈接器——通常名為 ld.so奢人,將負(fù)責(zé)檢查貼過(guò)標(biāo)簽的內(nèi)容谓媒,并完成鏈接的最后一個(gè)步驟:導(dǎo)入庫(kù)里的代碼,并將所有符號(hào)都關(guān)聯(lián)在一起)何乎。另外句惯,共享庫(kù)與靜態(tài)庫(kù)還存在一個(gè)巨大的差異,即鏈接的粒度(the granularity of thelink)支救,如果程序中只引用了共享庫(kù)里的某個(gè)符號(hào)(比如抢野,只使用了 libc.so 庫(kù)中的printf),那么整個(gè)共享庫(kù)都將映射到程序地址空間中搂妻,這與靜態(tài)庫(kù)的行為完全不同蒙保,靜態(tài)庫(kù)中只會(huì)導(dǎo)入與該符號(hào)相關(guān)的那個(gè)目標(biāo)文件。
The reason for this larger granularity is because modern operating systems are clever enough that you can save more than just the duplicate disk space that happens with static libraries; different running processes that use the same shared library can also share the code segment (but not the data/bss segments—two different processes could be in different places for their strtok after all). In order to do this, the whole library has to be mapped in one go, so that the internal references all line up to the same places—if one process pulled in a.o and c.o and another pulled in b.o and c.o, there wouldn't be any commonality for the OS to leverage.