1. 程式人生 > >2018-2019-1 20189204《Linux內核原理與分析》第八周作業

2018-2019-1 20189204《Linux內核原理與分析》第八周作業

不可 作業 windows makefile a.out .so .so文件 info 聯合

《庖丁解牛》第7章——可執行程序工作原理

一、《庖丁解牛》學習內容總結

1.A.out(最古老) COFF格式 PE(Windows)、ELF(Linux中)
2.ELF文件的3種類型

  • 可重定位文件
  • 可執行文件
  • 共享目標文件 可以簡單理解為沒有主函數main的“可執行”文件 Linux下共享庫後綴為.so文件

3.ELF文件的作用

  • 用於編譯和連接(可重定位文件)
  • 用於加載執行(可執行文件)
  • 共享文件兩者都有

4.一個可重定位文件保存著代碼和適當的數據,用來和其他的object文件一起來創建一個可執行文件或者是一個共享文件。一個可執行文件保存著一個用來執行的程序;該文件指出了exec(BA_OS)如何來創建程序進程映象。一個共享object文件保存著代碼和合適的數據,用來被下面的兩個鏈接器鏈接。第一個是連接編輯器[請參看ld(SD_CMD)],可以和其他的可重定位和共享object文件來創建其他的object。第二個是動態鏈接器,聯合一個可執行文件和其他的共享object文件來創建一個進程映象。

5.ELF頭描述了該文件的組織情況,程序投標告訴系統如何創建一個進程的內存映像,section頭表包含了描述文件sections的信息。當系統要執行一個文件的時候,理論上講,他會把程序段拷貝到虛擬內存中某個段。

6.程序從0x804800開始,可執行文件加載到內存中開始執行的第一行代碼,一般靜態鏈接將會把所有代碼放在同一個代碼段,動態連接的進程會有多個代碼段。

7.①編譯器預處理
gcc -E -o XX.cpp XX.c (-m32)//
註:把include的文件包含進來,並且完成宏的替換
②匯編器編譯成匯編代碼
gcc -x cpp-output -S -o hello.s hello.cpp (-m32)
③匯編代碼編譯成二進制目標文件
gcc -x assembler -c hello.s -o hello.o (-m32)
註:不可讀,含有部分機器代碼但不可執行
④鏈接成可執行文件
gcc -o hello.static hello.c (-m32) -static
⑤hello和hello.o都是ELF文件
⑥.static文件會將所有用到C庫文件都放到這一個可執行程序中

二、實驗樓實驗過程

更新menu內核
技術分享圖片
查看test.c文件:可以看到新增加了exec系統調用
技術分享圖片
技術分享圖片
直接:e hello.c切換到hello.c
技術分享圖片

查看Makefile
技術分享圖片

啟動內核並驗證execv函數
技術分享圖片
凍結內核,啟動GDB調試
技術分享圖片

先停在sys_execve處,再設置其它斷點;按c一路運行下去直到斷點sys_execve
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片

new_ip是返回到用戶態的第一條指令
退出調試狀態,輸入redelf -h hello可以查看hello的EIF頭部
技術分享圖片
技術分享圖片
技術分享圖片
新開一個窗口,進入內部可以發現正在修改內核堆棧
技術分享圖片

技術分享圖片

struct pt_regs *regs就是內核堆棧棧底的部分,發生中斷的時候,esp和ip都進行壓棧。通過修改內核堆棧中EIP的值(也就是把壓入棧中的值用new_ip替換)作為新程序的起點。

三、學習中遇到的問題技術分享圖片

技術分享圖片

2018-2019-1 20189204《Linux內核原理與分析》第八周作業