第三章 目標文件格式

主流的可執(zhí)行文件有:windows下的PE和linux下的ELF舞蔽,他們都是COFF格式的變種荣病。
目標文件:源代碼編譯以后但未進行鏈接的中間文件,它和可執(zhí)行文件格式幾乎一樣渗柿。

各種命名

  1. 可重定位文件.o
    文件中包含代碼和數(shù)據(jù)个盆,可以被用來鏈接成可執(zhí)行文件或是共享目標文件脖岛,靜態(tài)鏈接庫歸為這一類。
    比如我們編譯未連接的目標文件也是這一類
  2. 可執(zhí)行文件
    包含了可執(zhí)行程序颊亮,一般沒有擴展名柴梆。都是鏈接以后的文件了。
  3. 共享目標文件.so
    包含代碼和數(shù)據(jù)终惑,可以和可重定向文件一起鏈接绍在,產(chǎn)生新的目標文件(不一定是可執(zhí)行文件)”⒂校或者是被動態(tài)鏈接器與可執(zhí)行文件結(jié)合作為進程映像的一部分運行(在堆和棧之間偿渡,靠近棧)
  4. 核心轉(zhuǎn)存文件core
    當進程以外終止時,系統(tǒng)可以將進程地址空間的內(nèi)容以及終止時的一些其他信息轉(zhuǎn)存到核心轉(zhuǎn)存文件霸奕。

目標文件格式

這個目標文件溜宽,可以是上面的4中文件中的一種哈

目標文件中的信息是分類存放的,該放數(shù)據(jù)的放數(shù)據(jù)铅祸,該放代碼的放代碼坑质。一個分類成為節(jié),或者是段临梗。
將文件信息分段存放的目的在于:

  1. 運行時數(shù)據(jù)和指令分別被映射到不同的虛擬內(nèi)存區(qū)域中涡扼。
    在內(nèi)存中:數(shù)據(jù)區(qū)可讀寫,代碼區(qū)只讀盟庞〕曰Γ可以防止程序指令被修改。
  2. 提高CPU緩存的命中率
    數(shù)據(jù)和代碼段分離有利于提高局部性什猖。
  3. 使得代碼區(qū)可供下個
    節(jié)省內(nèi)存票彪。

File Header

該段,主要存儲了不狮,整個文件的屬性降铸,包括文件是否可以執(zhí)行,動態(tài)鏈接還是靜態(tài)連接摇零,入口地址推掸,目標硬件,目標操作系統(tǒng)等息息驻仅。
還有就是一個段表谅畅,保存了該文件中所有端的便宜位置,以及段的屬性噪服。

頭部有一個對應的數(shù)據(jù)結(jié)構(gòu)毡泻,定義在/usr/include/elf.h中。
其中包括:

ELF頭

e_ident:主要對應著Magic,是該文件標識碼粘优。

第一位對應DEL控制符(0x7f)仇味,接下來三位是ELF的ASCII呻顽,第五位01表示32位,02表示63位邪铲,第六位表示字節(jié)序芬位,第七位表示ELF文件的主版本號,主要是1带到,后面的一般用0填充了昧碉。
該字段又被解析為:


Magic

e_type表示文件類型

ET_REL:可重定向文件1
ET_EXEC:可執(zhí)行文件2
ET_DYN:共享目標文件3

e_machine機器類型

主要是cpu平臺屬性。

e_shoff段表的起始位置

指出段表在ELF文件中的位置

段表

段又對應一個結(jié)構(gòu)體揽惹,每個段一個被饿,該結(jié)構(gòu)體中主要包含,段名搪搏,段類型狭握,段標志位,段的虛擬地址疯溺,段偏移论颅,段長度,等等囱嫩。

段名只是個名字恃疯,段類型才真正表示該段的類型。
類型包括墨闲,標號為值:

  1. SHT_NULL無效段
  2. SHU_PROGBITS程序段今妄,代碼段,數(shù)據(jù)段都是該類型
  3. SHT_SYMTAB符號表
  4. SHU_STRTAB字符串表
  5. SHT_RELA重定位表
    等等

段標志指示該段在虛擬地址空間中的屬性鸳碧,可寫盾鳞,需要分配空間,可執(zhí)行瞻离。

代碼段 .code.text

一般為.text,包含了程序中的代碼部分腾仅。

已初始化全局變量和局部靜態(tài)變量 .data

已初始化的全局變量和靜態(tài)局部變量,存儲在.data段中套利。
也就是我們聲明并定義了的那些變量攒砖。
但是一些字符串常量保存在.rodata段中。

只讀數(shù)據(jù)段.rodata

該段存放只讀數(shù)據(jù)日裙,一般是程序中的只讀變量,const修飾的變量和字符串常量惰蜜。
該段的存在保證了程序的安全性昂拂。
上述兩段中的數(shù)據(jù),在文件中就存儲了抛猖。

未初始化全局變量和局部靜態(tài)變量.bss

未初始化的變量格侯,因為沒有值或是默認值鼻听,所以目標文件中不占位置。
但是.bss段在虛擬內(nèi)存中給這些變量留了空間
同時一些變量初始化為默認值联四,也有可能被編譯器放入.bss段撑碴。

注釋信息段.comment

存放編譯器的信息,版本號之類的朝墩。

同時我們也可以自己定義一個段:

__attribute__((section("FOO"))) int i = 42;

可以顯示的聲明將該變量放入.FOO段中醉拓。

重定位表.rel.text.rel.data

段類型為SHT_REL
編譯器在處理目標文件的時候收苏,不許對某些不問進行重定位亿卤,即代碼段和數(shù)據(jù)段中那些絕對地址的引用位置。這些息息都記錄在ELF文件的重定位表里面鹿霸。
每個需要重定位的代碼段或數(shù)據(jù)段排吴,都會有一個對應的重定位表。
.rel.text是針對.text段的重定位表懦鼠。
其中段表的sh_info對應的值就是所針對的段的下表钻哩。

字符串表.strtab.shstrtab

.strtab字符串表用來保存普通字符串,后一個.shstrtab段表字符串表肛冶,用來保存段表中用到的字符串街氢,常見的就是表名。我們自己定義的淑趾。 .shstrtab其在段表中的下表就是File Head結(jié)構(gòu)中e_shstrndx阳仔。所以,系統(tǒng)讀取了ELF文件的表頭扣泊,就可以獲得段表和段名近范,從而解析了整個ELF文件。

符號表.symtab

符號表中存儲著程序所有的(全局的延蟹,可以被其他模塊引用或引用其他模塊)變量名评矩,函數(shù)名,局部變量和函數(shù)阱飘,還有段名斥杜,行號信息(指令在源代碼中對應位置),每一個符號對應一個符號值沥匈,變量和函數(shù)的符號值就是他們的地址蔗喂。
符號表中的每一項也是一個結(jié)構(gòu)體

符號表每一項結(jié)構(gòu)體

對應的是:符號名,符號值高帖,符號對應的類型的大小缰儿,符號類型,0散址,符號所在段乖阵。

st_info:符號類型可選為:

  1. STB_LOCAL局部符號0宣赔,對于目標文件外部不可見
  2. STB_GLOBAL全度符號1,對外部可見
  3. STB_WEAK弱引用2

另外鏈接器還自己定義了幾個符號瞪浸。

符號修飾語函數(shù)簽名

修飾機制是用來防止靜態(tài)變量名字沖突的儒将。

.debug

在編譯的時候使用-g,可以額外生成該段对蒲。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钩蚊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子齐蔽,更是在濱河造成了極大的恐慌两疚,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件含滴,死亡現(xiàn)場離奇詭異诱渤,居然都是意外死亡,警方通過查閱死者的電腦和手機谈况,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門勺美,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人碑韵,你說我怎么就攤上這事赡茸。” “怎么了祝闻?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵占卧,是天一觀的道長。 經(jīng)常有香客問我联喘,道長华蜒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任豁遭,我火速辦了婚禮叭喜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蓖谢。我一直安慰自己捂蕴,他們只是感情好,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布闪幽。 她就那樣靜靜地躺著啥辨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盯腌。 梳的紋絲不亂的頭發(fā)上溉知,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機與錄音,去河邊找鬼着倾。 笑死,一個胖子當著我的面吹牛燕少,可吹牛的內(nèi)容都是我干的卡者。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼客们,長吁一口氣:“原來是場噩夢啊……” “哼崇决!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起底挫,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤恒傻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后建邓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盈厘,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年官边,在試婚紗的時候發(fā)現(xiàn)自己被綠了沸手。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡注簿,死狀恐怖契吉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诡渴,我是刑警寧澤捐晶,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站妄辩,受9級特大地震影響惑灵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恩袱,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一泣棋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧畔塔,春花似錦潭辈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谅辣,卻和暖如春修赞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工柏副, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留勾邦,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓割择,卻偏偏與公主長得像眷篇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子荔泳,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

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