《深入理解計算機系統》 圖7-9 重定位算法理解

重定位算法

foreach section s {
    foreach relocation entry r {
        refptr = s + r.offset;
        if (r.type == R_386_PC32) {
            refaddr = ADDR(s) + r.offset;
            *refptr = (unsigned) (ADDR(r.symbol) + *refptr - refaddr);
        }
        if (r.type == R_386_32) {
            *refptr = (unsigned) (ADDR(r.symbol) + *refptr);
        }
    }
}

理解

  1. 重定位PC相對引用

    *refptr是要重定位的內容(即要重定位的引用的地址),ADDR(r.symbol) - refaddr 是運行時引用的地址到符號的偏址。運行到該指令時PC爲

    push PC onto stack
    PC <- PC + *refptr

    那麼運行時實際的偏址就應該是*refptr + 引用的地址到符號的偏址*refptr + ADDR(r.symbol) - refaddr

  2. 重定位絕對引用

    對於絕對引用,就只需要將運行時地址加上引用地址即可,即ADDR(r.symbol) + *refptr

發佈了27 篇原創文章 · 獲贊 7 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章