7.6
buf前加了extern是外部符號,由main.c定義,故定義符號的模組是main.o,是int型變數,屬於.data節;bufp0和swap函式前未加extern和static,故是全域性符號,都在swap.c中定義,故定義符號的模組是swap.o,變數bufp0屬於.data節,swap函式屬於.text節;bufp1、incr、count前均有static,是本地符號,都在模組swap.o定義,swap、count屬於.data節,incr是函式屬於.text節;buf、bufp0、bufp1、swap、incr、count都被模組swap.o引用或定義,故都在swap.o.symtab條目中,而temp是區域性變數,執行時儲存在棧中,故不在swap.o.symtab條目中。
第一次重定位是mov 0x0,%edx,對應於圖7-10中的15行,將swap.o中偏移量為3-6的位置上的0x0重定位於執行時的真實位址0x80483c8+3=0x80483cb,其值為0x804945c;第二次重定位是mov 0x4,%eax,在圖中16行,將swap.o中偏移量為8-b位置上的0x4重定位與執行時的真實位址0x80483c8+8=0x80483d0,其值為0x8049458。第三次和第四次重定位在movl $0x4,0x0,對應於圖7-10的18行,將swap.o中偏移量為10-13的0x0和偏移量為14-17的0x4重定位於執行時的位址0x80483c8+10=0x80483d8和0x80483c8+14=0x80483dc,並將movl $0x4,0x0修改為movl $0x8049458,0x8049548.第五次重定位是mov 0x0,%eax,在圖7-10的23行,將偏移量為1f-22的0x0重定位於位址0x80483c8+1f=0x80483e7上的值0x8049548。
a.首先看.text節,在偏移為12的位置發生函式呼叫,在偏移為19的位置發生值的傳遞,並且這裡的值為0x0,應該是要被重定位的,結合c**分析可知,該處呼叫時函式p3()呼叫後的返回值放入%edx中,再和*xp相加,然後再在偏移為21的位置發生函式p2()的呼叫,所以在.text中要進行三次重定位,分別對指令call 12、指令mov 0x0,%eax和指令call 21進行重定位。
b.修改xp的值,重定位於x的位址,故在.data中只進行一次重定位,節偏移為0x4,重定位型別是重定位絕對引用,符號名字是xp。
CSAPP第七章筆記
講完鏈結之後,接著講載入 load 但是載入不是最重要的,而是第二重要的,其中包括了動態鏈結部分,所以這一章的主題是鏈結。作者列出了4大好處來 我們看本章 理解鏈結器將幫助你理解語言作用域規則是如何實現的 個人體會 鏈結器只關心全域性符號和static符號,不關心區域性變數,區域性變數是棧的事情 理...
CSAPP第七章筆記
第七章總結圖 注意 1.在linux系統中,生成動態庫時執行的命令 gcc fpic shared o 其中 shared是表明在裝載時進行重定位,fpic是表明生成位址無關 2.顯示使用動態庫的方法 linux系統中 呼叫dlopen dlsym dlerror dlclose 這四個函式進行動態...
第七章作業
7.9 編乙個程式,用成員函式過載運算子 和 將兩個矩陣 這兩個矩陣均為2行3列 相加和相減,要求第乙個矩陣的值由建構函式設定,另乙個矩陣的值由鍵盤輸入。include using namespace std class matrix maritx maritx maritx maritx int ...