幫 C/C++ 程序員徹底了解鏈接器

http://blog.jobbole.com/96225/#compiler_chs

圖1 What The Operating System Does

.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.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末欲主,一起剝皮案震驚了整個(gè)濱河市邓厕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扁瓢,老刑警劉巖详恼,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異引几,居然都是意外死亡昧互,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)伟桅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)敞掘,“玉大人,你說(shuō)我怎么就攤上這事楣铁【裂悖” “怎么了谎柄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵本刽,是天一觀的道長(zhǎng)妨退。 經(jīng)常有香客問(wèn)我目木,道長(zhǎng),這世上最難降的妖魔是什么劲厌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任膛薛,我火速辦了婚禮,結(jié)果婚禮上补鼻,老公的妹妹穿的比我還像新娘哄啄。我一直安慰自己,他們只是感情好辽幌,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布增淹。 她就那樣靜靜地躺著,像睡著了一般乌企。 火紅的嫁衣襯著肌膚如雪虑润。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天加酵,我揣著相機(jī)與錄音拳喻,去河邊找鬼。 笑死猪腕,一個(gè)胖子當(dāng)著我的面吹牛冗澈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播陋葡,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼亚亲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了腐缤?” 一聲冷哼從身側(cè)響起捌归,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎岭粤,沒(méi)想到半個(gè)月后惜索,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剃浇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年巾兆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虎囚。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡角塑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出淘讥,到底是詐尸還是另有隱情圃伶,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布适揉,位于F島的核電站留攒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嫉嘀。R本人自食惡果不足惜炼邀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望剪侮。 院中可真熱鬧拭宁,春花似錦、人聲如沸瓣俯。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)彩匕。三九已至腔剂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間驼仪,已是汗流浹背掸犬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绪爸,地道東北人湾碎。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像奠货,于是被迫代替她去往敵國(guó)和親介褥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容