《深入理解计算机系统》 图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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值