1. 程式人生 > 其它 >20191323王予涵2.3.1測試

20191323王予涵2.3.1測試

20191323王予涵2.3.1測試

任務詳情

  1. 推薦在OpenEuler系統中實現
  2. 編輯並執行2.3.1中的程式碼,要求在不修改t2.c 和 t1.c中main函式中的程式碼的情況下,程式執行結果是你的後四位學號。提交程式碼和執行結果截圖。
  3. 網上學習objdump命令,提交不少於5篇部落格連結和微信讀書上的圖書連結,並給出你認為最好的講解資源的連結或圖書名及章節
  4. 用objdump分析第1步中的可執行檔案和目標檔案,提交你的分析截圖以及如何和教材講解內容對應的,比如obj檔案的檔案頭,程式碼段,資料段等,可執行檔案如何連結mysum的。

0、測試環境

openeuler(wsl):

1、執行結果為學號

  1. 使用gdb除錯
  2. 在line12處打斷點
  3. 使用print c=1323將變數c的值修改為1323
  4. 輸出

2、學習objdump命令

部落格:

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中的重定位資訊調整偏移量

替換所有預留呼叫地址:

完成連結,生成可執行檔案