版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、漫談兼容內核之九:ELF映像的裝入(二).txt我們用一只眼睛看見現(xiàn)實的灰墻,卻用另一只眼睛勇敢飛翔,接近夢想。男人喜歡聽話的女人,但男人若是喜歡一個女人,就會不知不覺聽她的話。漫談兼容內核之九:ELF映像的裝入(二)[align=center][size=4][b]漫談兼容內核之九:ELF映像的裝入(二)[b][size][align][align=center]毛德操[align]上一篇漫談介紹了在通過execve()系統(tǒng)調用啟動一
2、個ELF格式的目標映像時發(fā)生于Linux內核中的活動。簡而言之,內核根據(jù)映像頭部所提供的信息把目標映像映射到(裝入)當前進程用戶空間的某個位置上;并且,如果目標映像需要使用共享庫的話,還要(根據(jù)映像頭部所提供的信息)將所需的“解釋器”的映像也映射到用戶空間的某個位置上,然后在從系統(tǒng)調用返回用戶空間的時候就“返回”到解釋器的入口,下面就是解釋器的事了。如果目標映像不使用共享庫,那么問題就比較簡單,返回用戶空間的時候就直接“返回”到目標映像
3、的入口。現(xiàn)代的應用軟件一般都要使用共享庫,所以我們把這當作常態(tài),而把不使用共享庫的應用軟件作為一種簡化了的特例。映像裝入用戶空間的位置有些是固定的、在編譯連接時就確定好了的;有些則是“浮動”的、可以在裝入時動態(tài)決定;具體要看編譯時是否使用了fPIC選項。一般應用軟件主體的映像都是固定地址的,而共享庫映像的裝入地址都是浮動的。特別地,解釋器映像的裝入地址也是浮動的。2ELF映像的結構每個操作系統(tǒng)對于在其內核上運行的可執(zhí)行程序二進制映像都有
4、特定的要求和規(guī)定,包括例如映像的格式,映像在用戶空間的布局(程序段、數(shù)據(jù)段、堆棧段的劃分等等),映像裝入用戶空間的地址是否可以浮動、以及如何浮動,是否支持動態(tài)連接、以及如何連接,如何進行系統(tǒng)調用,等等。這些要求和規(guī)定合在一起就構成了具體操作系統(tǒng)的“應用(軟件)二進制界面(ApplicationBinaryInterface)”,縮寫成ABI。顯然,ABI是二進制映像的“生產者”即編譯連接工具和使用者即映像裝入啟動手段之間的一組約定。而我
5、們一般所說的二進制映像格式,實際上并不僅僅是指字面意義上的、類似于數(shù)據(jù)結構定義那樣的“格式”,還包括了跟映像裝入過程有關的其它約定。所以,二進制映像格式是ABI的主體。目前的LinuxABI是在Unix系統(tǒng)5的時期(大約在1980年代)發(fā)展起來的,其主體就是ELF,這是“可執(zhí)行映像和連接格式(ExecutableLnkingFmat)”的縮寫。讀者已經(jīng)看到,ELF映像文件的開始是個ELF頭,這是一個數(shù)據(jù)結構,結構中有個指針(位移量),指
6、向文件中的一個“程序頭”數(shù)組(表)。各個程序頭表項當然也是數(shù)據(jù)結構,這是對映像文件中各個“節(jié)(Segment)”的(結構性)描述。從映像裝入的角度看,一個映像是由若干個Segment構成的。有些Segment需要被裝入、即被映射到用戶空間,有些則不需要被裝入。在前一篇漫談中讀者已經(jīng)看到,只有類型為PT_LOAD的Segment才需要被裝入。所以,映像裝入的過程只“管”到Segment為止。而從映像的動態(tài)連接、重定位(即浮動)、和啟動運行
7、的角度看,則映像是由若干個“段(Section)”構成的。我們通常所說映像中的“代碼段”、“數(shù)據(jù)段”等等都是Section。所以,動態(tài)連接和啟動運行的過程所涉及的則是Section。一般而言,一個Segment可以包含多個Section。其實,Segment和Section都是從操作處理的角度對映像的劃分;對于不同的操作處理,劃分的方式也就可以不同。所以,讀者在后面將會看到,一個Segment里面也可以包含幾個別的Segment,這就是
8、因為它們是按不同的操作處理劃分的、不同意義上的Segment。Section也是一樣。●映像的程序入口地址為0x8048750。如前所述,EXEC映像的裝入地址是固定的、不能浮動?!癯绦蝾^數(shù)組起點在文件中的位移為52(字節(jié)),而ELF頭的大小正好也是52,所以緊接ELF頭的后面就是程序頭數(shù)組。數(shù)組的大小為6,即映像中有6個Segment?!馭ection頭的數(shù)組則一直在后面位移位114904的地方,映像中有36個Section。于是,我
9、們接下去看程序頭數(shù)組:ProgramHeaders:TypeOffsetVirtAddrPhysAddrFileSizMemSizFlgAlignPHDR0x0000340x080480340x080480340x000c00x000c0RE0x4INTERP0x0000f40x080480f40x080480f40x000130x00013R0x1[Requestingprograminterpreter:libldlinux.so.
10、2]LOAD0x0000000x080480000x080480000x011cc0x011ccRE0x1000LOAD0x0011cc0x0804a1cc0x0804a1cc0x001580x00160RW0x1000DYNAMIC0x0011d80x0804a1d80x0804a1d80x000d80x000d8RW0x4NOTE0x0001080x080481080x080481080x000200x00020R0x4一個程序頭就
11、是關于一個Segment的說明,所以這就是6個Segment。第一個Segment的類型是PHDR,在文件中的位移為0x34、即52,這就是程序頭數(shù)組本身。其大小為0xc0、即192。前面說每個程序頭的大小為32字節(jié),而6X32=192。第二個Segment的類型是INTERP,即“解釋器”的文件路徑名,是個字符串,這里說是“l(fā)ibldlinux.so.2”。下面是兩個類型為LOAD的Segment。如前所述,只有這種類型的Segmen
12、t才需要裝入。但是,看一下前者的說明,其起點在文件中的位移是0,大小是0x011cc,顯然是把ELF頭和前兩個Segment也包含在里面了。再看后者,其起點的位移是0x011cc,所以是和前者連在一起的;其大小為0x158,這樣兩個Segment合在一起是從0到0x1324。計算一下就可知道,實際上是把所有的Segment都包括進去了。所以,對于這個特定的映像,說是只裝入類型為LOAD的Segment,實際上裝入的卻是整個映像。那么,映
13、像中的什么內容可以不必裝入呢?例如bss段,那是無初始內容的數(shù)據(jù)段,就不用裝入;還有(與動態(tài)連接無關的)符號表,那也不需要裝入。注意兩個LOAD類Segment的邊界(Alignment)都是0x1000,即4KB,那正好是存儲頁面的大小。還有個問題,既然兩個LOAD類的Segment是連續(xù)的,那為什么不合并成一個呢?看一下它們的特性標志位就可以知道,第一個Segment的映像是可讀可執(zhí)行、但是不可寫;第二個則是可讀可寫、但是不可執(zhí)行,
14、這當然不能合并。再往下看,下一個Segment的類型是DYNAMIC,那就是跟動態(tài)連接有關的信息。如上所述,這個Segment其實是包含在前一個Segment中的,所以也會被裝入。最后一個Segment的類型是NOTE,那只是注釋、說明一類的信息了。當然,跟動態(tài)連接有關的信息是我們最為關心的,所以我們看一下這個Segment的具體內容:Dynamicsegmentatoffset0x11d8contains22entries:TagTy
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論