国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区

掃一掃
關注微信公眾號

UNIX/Linux平臺上可執行文件格式分析 一
2007-04-25   中國IT實驗室

可執行文件格式綜述

  相對于其它文件類型,可執行文件可能是一個操作系統中最重要的文件類型,因為它們是完成操作的真正執行者。可執行文件的大小、運行速度、資源占用情況以及可擴展性、可移植性等與文件格式的定義和文件加載過程緊密相關。

  研究可執行文件的格式對編寫高性能程序和一些黑客技術的運用都是非常有意義的。

  不管何種可執行文件格式,一些基本的要素是必須的,顯而易見的,文件中應包含代碼和數據。因為文件可能引用外部文件定義的符號(變量和函數),因此重定位信息和符號信息也是需要的。一些輔助信息是可選的,如調試信息、硬件信息等。基本上任意一種可執行文件格式都是按區間保存上述信息,稱為段(Segment)或節(Section)。不同的文件格式中段和節的含義可能有細微區別,但根據上下文關系可以很清楚的理解,這不是關鍵問題。最后,可執行文件通常都有一個文件頭部以描述本文件的總體結構。

  相對可執行文件有三個重要的概念:編譯(compile)、連接(link,也可稱為鏈接、聯接)、加載(load)。源程序文件被編譯成目標文件,多個目標文件被連接成一個最終的可執行文件,可執行文件被加載到內存中運行。因為本文重點是討論可執行文件格式,因此加載過程也相對重點討論。下面是LINUX平臺下ELF文件加載過程的一個簡單描述。

  1:內核首先讀ELF文件的頭部,然后根據頭部的數據指示分別讀入各種數據結構,找到標記為可加載(loadable)的段,并調用函數 mmap()把段內容加載到內存中。在加載之前,內核把段的標記直接傳遞給 mmap(),段的標記指示該段在內存中是否可讀、可寫,可執行。顯然,文本段是只讀可執行,而數據段是可讀可寫。這種方式是利用了現代操作系統和處理器對內存的保護功能。著名的Shellcode(參考資料 17)的編寫技巧則是突破此保護功能的一個實際例子。

  2:內核分析出ELF文件標記為 PT_INTERP 的段中所對應的動態連接器名稱,并加載動態連接器。現代 LINUX 系統的動態連接器通常是 /lib/ld-linux.so.2,相關細節在后面有詳細描述。

  3:內核在新進程的堆棧中設置一些標記-值對,以指示動態連接器的相關操作。

  4:內核把控制傳遞給動態連接器。

  5:動態連接器檢查程序對外部文件(共享庫)的依賴性,并在需要時對其進行加載。

  6:動態連接器對程序的外部引用進行重定位,通俗的講,就是告訴程序其引用的外部變量/函數的地址,此地址位于共享庫被加載在內存的區間內。動態連接還有一個延遲(Lazy)定位的特性,即只在"真正"需要引用符號時才重定位,這對提高程序運行效率有極大幫助。

  7:動態連接器執行在ELF文件中標記為 .init 的節的代碼,進行程序運行的初始化。在早期系統中,初始化代碼對應函數 _init(void)(函數名強制固定),在現代系統中,則對應形式為

void

__attribute((constructor))

init_function(void)

{

……

}

  其中函數名為任意。

  8:動態連接器把控制傳遞給程序,從 ELF 文件頭部中定義的程序進入點開始執行。在 a.out 格式和ELF格式中,程序進入點的值是顯式存在的,在 COFF 格式中則是由規范隱含定義。

  從上面的描述可以看出,加載文件最重要的是完成兩件事情:加載程序段和數據段到內存;進行外部定義符號的重定位。重定位是程序連接中一個重要概念。我們知道,一個可執行程序通常是由一個含有 main() 的主程序文件、若干目標文件、若干共享庫(Shared Libraries)組成。(注:采用一些特別的技巧,也可編寫沒有 main 函數的程序,請參閱參考資料 2)一個 C 程序可能引用共享庫定義的變量或函數,換句話說就是程序運行時必須知道這些變量/函數的地址。在靜態連接中,程序所有需要使用的外部定義都完全包含在可執行程序中,而動態連接則只在可執行文件中設置相關外部定義的一些引用信息,真正的重定位是在程序運行之時。靜態連接方式有兩個大問題:如果庫中變量或函數有任何變化都必須重新編譯連接程序;如果多個程序引用同樣的變量/函數,則此變量/函數會在文件/內存中出現多次,浪費硬盤/內存空間。比較兩種連接方式生成的可執行文件的大小,可以看出有明顯的區別。

  a.out 文件格式分析

  a.out 格式在不同的機器平臺和不同的 UNIX 操作系統上有輕微的不同,例如在 MC680x0 平臺上有 6 個 section。下面我們討論的是最"標準"的格式。

  a.out 文件包含7 個section,格式如下:

exec header(執行頭部,也可理解為文件頭部)

text segment(文本段)

data segment(數據段)

text relocations(文本重定位段)

data relocations(數據重定位段)

symbol table(符號表)

string table(字符串表)

  執行頭部的數據結構:

struct exec {

unsigned long a_midmag; /* 魔數和其它信息 */

unsigned long a_text; /* 文本段的長度 */

unsigned long a_data; /* 數據段的長度 */

unsigned long a_bss; /* BSS段的長度 */

unsigned long a_syms; /* 符號表的長度 */

unsigned long a_entry; /* 程序進入點 */

unsigned long a_trsize; /* 文本重定位表的長度 */

unsigned long a_drsize; /* 數據重定位表的長度 */

};

  文件頭部主要描述了各個 section 的長度,比較重要的字段是 a_entry(程序進入點),代表了系統在加載程序并初試化各種環境后開始執行程序代碼的入口。這個字段在后面討論的 ELF 文件頭部中也有出現。由 a.out 格式和頭部數據結構我們可以看出,a.out 的格式非常緊湊,只包含了程序運行所必須的信息(文本、數據、BSS),而且每個 section 的順序是固定的。這種結構缺乏擴展性,如不能包含"現代"可執行文件中常見的調試信息,最初的 UNIX 黑客對 a.out 文件調試使用的工具是 adb,而 adb 是一種機器語言調試器!

  a.out 文件中包含符號表和兩個重定位表,這三個表的內容在連接目標文件以生成可執行文件時起作用。在最終可執行的 a.out 文件中,這三個表的長度都為 0。a.out 文件在連接時就把所有外部定義包含在可執行程序中,如果從程序設計的角度來看,這是一種硬編碼方式,或者可稱為模塊之間是強藕和的。在后面的討論中,我們將會具體看到ELF格式和動態連接機制是如何對此進行改進的。

  a.out 是早期UNIX系統使用的可執行文件格式,由 AT&T 設計,現在基本上已被 ELF 文件格式代替。a.out 的設計比較簡單,但其設計思想明顯的被后續的可執行文件格式所繼承和發揚。可以參閱參考資料 16 和閱讀參考資料 15 源代碼加深對 a.out 格式的理解。參考資料 12 討論了如何在"現代"的紅帽LINUX運行 a.out 格式文件。

熱詞搜索:

上一篇:Linux中用戶賬號和用戶home目錄
下一篇:UNIX/Linux平臺上可執行文件格式分析 二

分享到: 收藏
国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区
一区二区三区精品视频在线| 日韩视频免费观看高清完整版| 粉嫩蜜臀av国产精品网站| 国产91在线观看| 色综合久久久久久久| 欧美性受xxxx黑人xyx性爽| 欧美一级高清大全免费观看| 国产午夜精品在线观看| 樱桃视频在线观看一区| 麻豆91精品视频| 91成人免费电影| 欧美xxxxx裸体时装秀| 日韩欧美中文一区二区| 一区二区三区在线影院| 国产成人综合亚洲网站| 日韩天堂在线观看| 亚洲成a人片综合在线| 国产 日韩 欧美大片| 精品国产伦一区二区三区免费 | 国产视频一区不卡| 日韩中文字幕91| 色综合久久久网| 国产精品视频一区二区三区不卡| 亚洲午夜精品一区二区三区他趣| 国内精品伊人久久久久av一坑| 在线观看av不卡| 国产精品免费视频观看| 亚洲国产美女搞黄色| 国产成人av电影| 欧美日韩不卡视频| 亚洲黄网站在线观看| 国产成人综合视频| 日韩免费在线观看| 日本伊人色综合网| 欧美在线|欧美| 国产精品青草久久| 国产一区美女在线| 69堂精品视频| 美女视频网站久久| 欧美亚洲一区二区在线观看| 亚洲婷婷在线视频| 视频在线在亚洲| 欧美三级电影在线看| 亚洲自拍另类综合| 色丁香久综合在线久综合在线观看| 91精品国产欧美一区二区成人| 国产精品久久久久久久岛一牛影视 | 欧美日韩一二三区| 午夜免费欧美电影| 日韩一区二区三区免费观看 | 乱中年女人伦av一区二区| 日韩精品一区二区三区swag | 欧美日韩在线三级| 免费人成在线不卡| 欧美一级日韩免费不卡| 精彩视频一区二区三区| 欧美成人一级视频| 懂色av一区二区在线播放| 最新欧美精品一区二区三区| 91久久精品一区二区| 亚洲va韩国va欧美va精品| 日韩一级片在线观看| 国产传媒欧美日韩成人| 亚洲女同ⅹxx女同tv| 欧美一区二区三区播放老司机| 国产福利一区二区三区| 久久精品无码一区二区三区| 91福利社在线观看| 麻豆精品一二三| 国产精品久久久久久久久果冻传媒| 精品视频在线看| 国产91清纯白嫩初高中在线观看 | 国产在线精品一区二区不卡了| 18成人在线观看| 亚洲午夜久久久久久久久电影网| 欧美成人女星排行榜| 欧美日韩国产一级二级| 成人国产精品免费观看| 久久国产免费看| 蜜桃传媒麻豆第一区在线观看| 一区二区欧美视频| 亚洲乱码一区二区三区在线观看| 日韩欧美第一区| 欧美日韩精品三区| 欧美性受xxxx| 欧美理论片在线| 欧美一区二区三区不卡| 欧美精品久久99久久在免费线 | 91精品婷婷国产综合久久性色 | 精品福利二区三区| 精品欧美一区二区在线观看| 精品国产乱码久久久久久老虎 | 国产午夜亚洲精品羞羞网站| 国产欧美在线观看一区| 欧美sm极限捆绑bd| 日本一区二区三区四区 | 免费高清不卡av| 另类小说色综合网站| 国产一区在线观看视频| 972aa.com艺术欧美| 日韩一区二区在线观看视频| 欧美日韩免费视频| 日韩片之四级片| 日韩理论片一区二区| 婷婷成人激情在线网| 亚洲第一在线综合网站| 成人夜色视频网站在线观看| 色综合咪咪久久| 精品国产免费久久| 亚洲人成网站影音先锋播放| 亚洲一区二区三区四区在线| 日韩在线卡一卡二| aaa欧美大片| 在线电影院国产精品| 国产精品家庭影院| 日韩黄色一级片| av亚洲精华国产精华精| 精品国产乱码久久久久久蜜臀| 国产精品素人视频| 日本91福利区| 在线观看日韩电影| 亚洲视频一区二区在线| 日韩国产精品久久久久久亚洲| 99r国产精品| 国产精品福利一区| 久久精品国产在热久久| 在线亚洲人成电影网站色www| 国产亚洲午夜高清国产拍精品| 午夜影院在线观看欧美| 成人一区二区三区| 国产免费久久精品| 国产一区二区三区在线看麻豆| 欧美一区二区三区思思人| 性感美女久久精品| 91看片淫黄大片一级| 精品乱码亚洲一区二区不卡| 免费成人av在线| 日韩欧美一级二级三级久久久| 日韩综合小视频| 日韩欧美美女一区二区三区| 免费在线观看不卡| 26uuu精品一区二区| 国产一区二区三区国产| 国产婷婷一区二区| 91同城在线观看| 亚洲国产日韩一级| 日韩午夜在线影院| 成人深夜视频在线观看| 亚洲成国产人片在线观看| 欧美电影免费观看完整版| 国产大陆a不卡| 一区二区三区精密机械公司| 91精品国产综合久久久久久久| 久久91精品国产91久久小草| 国产精品成人网| 欧美高清激情brazzers| 97超碰欧美中文字幕| 久久精品国产免费看久久精品| 欧美国产欧美综合| 337p日本欧洲亚洲大胆色噜噜| 色天天综合久久久久综合片| 黄色日韩网站视频| 日韩电影在线免费| 亚洲欧洲成人精品av97| 26uuu精品一区二区| 欧美日韩国产欧美日美国产精品| 国产精品夜夜爽| 久久激情五月激情| 中文字幕在线观看不卡| 国产精品―色哟哟| 国产免费观看久久| 国产清纯在线一区二区www| 日韩午夜三级在线| 欧美一区二区三区的| 欧美日韩成人一区| 欧美日韩精品一区二区在线播放| 色菇凉天天综合网| 波多野结衣在线一区| 粉嫩一区二区三区在线看| 国内精品伊人久久久久av一坑| 九九视频精品免费| 国产在线不卡视频| 懂色av噜噜一区二区三区av| 韩国午夜理伦三级不卡影院| 国产在线精品一区二区不卡了| 全国精品久久少妇| 国产电影一区在线| 99视频国产精品| 欧美日韩中文字幕一区二区| 欧美高清dvd| 久久免费国产精品| 国产精品麻豆久久久| 一区二区三区在线视频免费| 午夜精品久久久| 国产99久久久国产精品潘金| 国产盗摄精品一区二区三区在线| 欧美性大战xxxxx久久久| 日韩三级视频中文字幕| 国产日韩欧美a| 午夜亚洲福利老司机|