三、目標文件里有什么

編譯后的目標文件包含機器指令惠桃、數(shù)據(jù)和鏈接所需要的一些信息浦夷,比如符號表、調(diào)試信息辜王、字符串等劈狐。目標文件將這些信息按不同的屬性,以段(Segment)的形式存儲呐馆。
從廣義上看肥缔,目標文件與可執(zhí)行文件的格式是一樣的,只是還沒經(jīng)過鏈接的過程汹来。Windows下的可執(zhí)行文件格式是PE续膳,Linux是ELF,它們都是COEF格式的變種收班。下文的剖析以ELF結(jié)構(gòu)為主坟岔。

目標文件的結(jié)構(gòu)

圖片.png
  1. ELF文件頭:
    包含描述整個文件的基本屬性,比如文件版本摔桦、目標機器型號等社付。
  2. 段表(Section Table):
    除文件頭以外最重要的結(jié)構(gòu),描述了各個段的信息邻耕,比如段名瘦穆、段長度、在文件中的偏移赊豌、讀寫權(quán)限和其他屬性扛或。
    編譯器、鏈接器和裝載器都是依靠段表定位和訪問各個段的屬性的碘饼。
    段表的位置由文件頭的“e_shoff”成員決定熙兔,圖中位于偏移0x118悲伶。
    段名對于編譯器、鏈接器有意義住涉,但對于操作系統(tǒng)無實際意義麸锉,操作系統(tǒng)的處理由段類型和段的標志位決定。
  3. 代碼段(常見的名字.code舆声、.text)
    編譯后的機器指令放在代碼段花沉。
  4. 數(shù)據(jù)段(.data)
    已初始化的全局變量和靜態(tài)變量放在數(shù)據(jù)段。
  5. 只讀數(shù)據(jù)段(.rodata)
    存放只讀數(shù)據(jù)媳握,一般是程序里的只讀變量(如const)和字符串常量(有些編譯器放在數(shù)據(jù)段)碱屁。好處有:語義上支持C++ const關(guān)鍵字;安全蛾找,操作系統(tǒng)加載的時候?qū)傩杂成涑芍蛔x娩脾,防止修改;支持只讀存儲器(ROM)訪問打毛。
  1. .bss段
    .bss段為未初始化的全局變量和靜態(tài)變量(初始化為0也默認為未初始化)預留位置柿赊,它并沒有內(nèi)容,也不占空間幻枉。
    有些編譯器不存放碰声,只是在符號表預留一個符號,鏈接的時候再在.bss段分配空間熬甫。
  2. 重定位表(.rel.text)
    重定位的信息記錄在重定位表里奥邮,每個要重定位的代碼段或數(shù)據(jù)段,都有一個相應的重定位表罗珍。
  3. 字符串表
    .strtab是字符串表洽腺,保存普通字符串,比如符號名字覆旱;.shstrtab是段表字符串表蘸朋,保存段表中用到的字符串,比如段名扣唱。
    字符串的長度往往是不定的藕坯,固定表示它比較困難。一種常見的做法是集中存放到一個表里噪沙,然后用偏移來表示炼彪。
  1. 符號表(.symtab)
    在鏈接中,我們將函數(shù)和變量統(tǒng)稱為符號(Symbol)正歼,函數(shù)名和變量名就是符號名辐马。此外,符號還包括文件名局义、段名和行號(可選)喜爷。
    每個目標文件都有一個符號表冗疮,記錄了所有符號。每個符號有一個對應的符號值檩帐,對于函數(shù)和變量來說术幔,符號值就是地址

為什么要把指令和數(shù)據(jù)分開存放

  1. 程序裝在后,數(shù)據(jù)和指令被映射到兩塊不同的區(qū)域湃密,可以設(shè)置指令只讀诅挑,數(shù)據(jù)可讀寫。
  2. 提高程序的局部性泛源,從而提高緩存命中率拔妥。
  3. 最重要的原因是,指令共享俩由。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末毒嫡,一起剝皮案震驚了整個濱河市癌蚁,隨后出現(xiàn)的幾起案子幻梯,更是在濱河造成了極大的恐慌,老刑警劉巖努释,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碘梢,死亡現(xiàn)場離奇詭異,居然都是意外死亡伐蒂,警方通過查閱死者的電腦和手機煞躬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逸邦,“玉大人恩沛,你說我怎么就攤上這事÷萍酰” “怎么了雷客?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長桥狡。 經(jīng)常有香客問我搅裙,道長,這世上最難降的妖魔是什么裹芝? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任部逮,我火速辦了婚禮,結(jié)果婚禮上嫂易,老公的妹妹穿的比我還像新娘兄朋。我一直安慰自己,他們只是感情好怜械,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布蜈漓。 她就那樣靜靜地躺著穆桂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪融虽。 梳的紋絲不亂的頭發(fā)上享完,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機與錄音有额,去河邊找鬼般又。 笑死,一個胖子當著我的面吹牛巍佑,可吹牛的內(nèi)容都是我干的茴迁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼萤衰,長吁一口氣:“原來是場噩夢啊……” “哼堕义!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起脆栋,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤倦卖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后椿争,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怕膛,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年秦踪,在試婚紗的時候發(fā)現(xiàn)自己被綠了褐捻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡椅邓,死狀恐怖柠逞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情景馁,我是刑警寧澤板壮,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站裁僧,受9級特大地震影響个束,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜聊疲,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一茬底、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧获洲,春花似錦阱表、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涉馁。三九已至,卻和暖如春爱致,著一層夾襖步出監(jiān)牢的瞬間烤送,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工糠悯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留帮坚,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓互艾,卻偏偏與公主長得像试和,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纫普,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

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