20191323王予涵2.3.1測試
阿新 • • 發佈:2021-10-30
20191323王予涵2.3.1測試
任務詳情
- 推薦在OpenEuler系統中實現
- 編輯並執行2.3.1中的程式碼,要求在不修改t2.c 和 t1.c中main函式中的程式碼的情況下,程式執行結果是你的後四位學號。提交程式碼和執行結果截圖。
- 網上學習objdump命令,提交不少於5篇部落格連結和微信讀書上的圖書連結,並給出你認為最好的講解資源的連結或圖書名及章節
- 用objdump分析第1步中的可執行檔案和目標檔案,提交你的分析截圖以及如何和教材講解內容對應的,比如obj檔案的檔案頭,程式碼段,資料段等,可執行檔案如何連結mysum的。
0、測試環境
openeuler(wsl):
1、執行結果為學號
- 使用gdb除錯
- 在line12處打斷點
- 使用print c=1323將變數c的值修改為1323
- 輸出
2、學習objdump命令
部落格:
- http://lnmp.ailinux.net/objdump --非常詳細
- http://tsengyia.blog.chinaunix.net/uid-9525959-id-2001838.html
- https://my.oschina.net/weitao520lin/blog/3101177 )
- https://blog.csdn.net/whatday/article/details/99154104
- https://blog.csdn.net/weixin_43092232/article/details/102764260
3、分析目標檔案和可執行檔案
目標檔案(t1.o為例):
t1.c
#include <stdio.h>
int g = 100;
int h;
static int s;
int mysum(int x, int y);
int main(int argc, char *argv[]){
int a =1;
int b;
static int c = 3;
b = 2;
c = mysum(a,b);
printf("sum=%d\n", c);
return 0;
}
檔案頭
objdump -h bin/t1.o
- text(程式碼段):已編譯程式的機器程式碼
- rodata:只讀資料,比如printf語句中的格式串和開關(switch)語句的跳轉表
- data(資料段):已初始化的全域性C變數。區域性C變數在執行時被儲存在棧中,既不出現在.data中,也不出現在.bss節中
- bss:未初始化的全域性C變數。在目標檔案中這個節不佔據實際的空間,它僅僅是一個佔位符。目標檔案格式區分初始化和未初始化變數是為了空間效率在:在目標檔案中,未初始化變數不需要佔據任何實際的磁碟空間
程式碼段
推送引數並儲存現場:
呼叫函式:
捕獲返回值,並恢復現場:
資料段
符號表:
可以看到非靜態全域性變數、函式名稱和屬性
可執行檔案連結mysum:
啟動程式碼(crt0.o):
呼叫main
整合t1.o和t2.o中的data段為單一data段:
整合整合t1.o和t2.o中的bss段為單一bss段:
用t1.o和t2.o中的重定位資訊調整偏移量
替換所有預留呼叫地址:
完成連結,生成可執行檔案