【问题标题】:Relocation of PE DLLs - Load-time or like ELF?PE DLL 的重定位 - 加载时或类似 ELF?
【发布时间】:2015-10-30 19:34:11
【问题描述】:

据我了解(主要来自可移植可执行格式的Wikipedia's article),Windows DLL 不使用与位置无关的代码,而是具有链接时间定义的首选基地址。但是,如果两个库的基地址发生冲突,则需要通过其重定位表来重定位一个。

这个 PE 重定位是否类似于 ELF 的 GOT 和 PLT(.data 部分中的进程本地表,要求每个绝对地址都经过间接寻址),还是更像动态重定位(在加载时所有绝对地址地址被翻译)?如果是后者,这在 x64 上会不会有问题?

【问题讨论】:

    标签: portable-executable relocation


    【解决方案1】:

    WIN32和WIN64的情况不同。

    对于存在重定位信息的 WIN32 映像(通常是非 EXE),二进制代码中的所有绝对地址都有一个相应的修复记录,以便加载程序可以修补该地址,以防模块的首选加载地址已经被其他东西占用了。

    对于 WIN64 映像,原则上情况类似,但实际上几乎所有 64 位指令实际上都使用与位置无关的编码,其中偏移量是 IP 相关的而不是绝对的,因此需要的重定位修复更少(如果在全部)。

    【讨论】:

    • 那么,对于 WIN32,重定位是在加载时完成的,然后在运行时内存引用是直接的? DLL 多久需要一次重定位(如果我从某个第 3 方下载库,它具有重定位信息的概率是多少)?
    • 在WIN64中,即使是RIP-relative寻址,难道你还不需要类似ELF格式的GOT和PLT的东西吗?
    • So, for WIN32 the relocation is done at load-time, and then at runtime the memory references are direct? - 正确。 How often do DLLs require relocation 这取决于几件事;是否选择了合理的随机加载地址?您是否碰巧没有其他常用模块使用重叠地址范围作为首选地址? (if I download a library from some 3rd party, what's the probability that it has relocation information)? 几乎 100%,如果你已经在他们的地址使用其他东西,他们会在脚上开枪。
    • 我对 ELF 格式不是很熟悉,抱歉 - 对此有更深入了解的人将不得不介入。
    • 这很有帮助,谢谢。让我取消我的 ELF 问题:我现在意识到,如果内存引用是直接的,则不需要像 GOT 和 PLT 这样的表,它们在加载时填充并允许间接寻址。
    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 2011-01-20
    • 2023-02-23
    • 2018-10-25
    相关资源
    最近更新 更多