C鏈接2 -目標(biāo)文件

鏈接器的任務(wù)

在上一篇文章中,我們提到鏈接是將多個(gè)可重定位目標(biāo)文件鏈接成一個(gè)可執(zhí)行目標(biāo)文件皿渗。必須要完成2件事

  • 符號(hào)解析斩芭,將每一個(gè)符號(hào)引用的定義聯(lián)系起來(lái)轻腺,比如foo.c中的num定義的地方是在main.c中乐疆。
  • 重定位,編譯器和匯編器生成從0地址開始的代碼和數(shù)據(jù)節(jié)(下文會(huì)提到)贬养,鏈接器把每一個(gè)符號(hào)定義與存儲(chǔ)器位置聯(lián)系起來(lái)挤土,然后修改所有對(duì)這些符號(hào)的引用。使得它們有正確的存儲(chǔ)器地址误算。從而重定位這些節(jié)仰美。
目標(biāo)文件

目標(biāo)文件一共有3類:

  • 可重定位目標(biāo)文件,包含二進(jìn)制代碼和數(shù)據(jù)儿礼,可以在咖杂;鏈接器中和其他可重定位目標(biāo)文件合并為1個(gè)可執(zhí)行目標(biāo)文件。
  • 可執(zhí)行目標(biāo)文件蚊夫,包行二進(jìn)制代碼和數(shù)據(jù)诉字。
  • 共享目標(biāo)文件,一種特殊類型的可重定位目標(biāo)文件,可以在加載或者運(yùn)行時(shí)被動(dòng)態(tài)的加載到存儲(chǔ)器并鏈接壤圃。
可重定位目標(biāo)文件

||
|---------|-----------|
|ELF頭|包括目標(biāo)ELF頭的大小陵霉,目標(biāo)文件的類型,機(jī)器類型,節(jié)頭部表等信息主要用來(lái)幫助鏈接器語(yǔ)法分析個(gè)解釋目標(biāo)文件的信息。
|.text|已編譯程序的機(jī)器代碼|
|.rodata|只讀數(shù)據(jù)抬探,比如"hello world"字符串和開關(guān)語(yǔ)句跳轉(zhuǎn)表
|.data|已初始化的全局C變量
|.bss|未初始化的全局C變量
|.symtab|符號(hào)表袱院,存放程序定義和引用的函數(shù)和全局變量的消息。有別于編譯器的符號(hào)表
|......|......|

符號(hào)和符號(hào)表

每個(gè)可重定位目標(biāo)模塊m都有一個(gè)符號(hào)表棺聊,它包含m所定義和引用的符號(hào)信息。

  • 由m定義并能被其他模塊所引用的全局符號(hào),對(duì)應(yīng)于非靜態(tài)的static屬性的C函數(shù)和一級(jí)定義為不帶static屬性的全局變量扁凛。
  • 由其他模塊定義并被模塊m引用的全局符號(hào)。這些符號(hào)稱為外部符號(hào)(external)對(duì)應(yīng)于定義在其他模塊中的C函數(shù)和全局變量
  • 只被模塊m定義和引用的本地符號(hào)闯传,有的本地鏈接器符號(hào)對(duì)應(yīng)于帶static屬性的C函數(shù)和全局變量谨朝。

可重定位目標(biāo)文件中有匯編器定義的符號(hào)表。

// ELF符號(hào)表?xiàng)l目
typedef struct{
    int name;            // 
    int value;            // 符號(hào)地址甥绿,可重定位來(lái)說(shuō)是節(jié)起始位置的偏移字币,對(duì)于可執(zhí)行來(lái)說(shuō)是絕對(duì)運(yùn)行的地址。
    int size;              // 目標(biāo)的大小
    char type: 4       // 通常是數(shù)據(jù)或者函數(shù)
    char binding: 4  // 本地符號(hào)還是全局符號(hào)
    char section      // 每個(gè)符號(hào)都和目標(biāo)文件的某個(gè)節(jié)相關(guān)聯(lián)共缕,這個(gè)字段表示某個(gè)節(jié)洗出,該字段是到節(jié)頭部表的索引。   
    ......         
}ELF_Symbol

關(guān)于節(jié)頭部表參考網(wǎng)友ELF文件-節(jié)和節(jié)頭

符號(hào)解析

鏈接器解析符號(hào)引用的方法是將每一個(gè)引用與它輸入的可重定位目標(biāo)文件的符號(hào)表中的一個(gè)確定的符號(hào)定義聯(lián)系起來(lái)在這里會(huì)有個(gè)問(wèn)題图谷,比如在C++/Java中函數(shù)可以重載翩活,那么它們函數(shù)名的符號(hào)表不是沖突了嗎?
在這里便贵,編譯器采用了一種叫做name mangling(中文有多種翻譯菠镇,但都感覺怪怪的,這里不翻譯了)的做法承璃。其實(shí)質(zhì)就是將每個(gè)方法和參數(shù)列表組合編碼成對(duì)鏈接器來(lái)說(shuō)唯一的名字利耍。比如Foo::bar(int, long)被編碼為bar__Fooil.這也從另一個(gè)角度說(shuō)明了為什么函數(shù)重載區(qū)分度為不同的參數(shù)類型和個(gè)數(shù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末盔粹,一起剝皮案震驚了整個(gè)濱河市隘梨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舷嗡,老刑警劉巖轴猎,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異进萄,居然都是意外死亡捻脖,警方通過(guò)查閱死者的電腦和手機(jī)烦秩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)郎仆,“玉大人只祠,你說(shuō)我怎么就攤上這事∪偶。” “怎么了抛寝?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)曙旭。 經(jīng)常有香客問(wèn)我盗舰,道長(zhǎng),這世上最難降的妖魔是什么桂躏? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任钻趋,我火速辦了婚禮,結(jié)果婚禮上剂习,老公的妹妹穿的比我還像新娘蛮位。我一直安慰自己,他們只是感情好鳞绕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布失仁。 她就那樣靜靜地躺著,像睡著了一般们何。 火紅的嫁衣襯著肌膚如雪萄焦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天冤竹,我揣著相機(jī)與錄音拂封,去河邊找鬼。 笑死鹦蠕,一個(gè)胖子當(dāng)著我的面吹牛冒签,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播片部,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼镣衡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了档悠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤望浩,失蹤者是張志新(化名)和其女友劉穎辖所,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體磨德,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缘回,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年吆视,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酥宴。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡啦吧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拙寡,到底是詐尸還是另有隱情授滓,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布肆糕,位于F島的核電站般堆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏诚啃。R本人自食惡果不足惜淮摔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望始赎。 院中可真熱鬧和橙,春花似錦、人聲如沸造垛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)筋搏。三九已至仆百,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間奔脐,已是汗流浹背俄周。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留髓迎,地道東北人峦朗。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像排龄,于是被迫代替她去往敵國(guó)和親波势。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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