【问题标题】:Should I change my Image Base?我应该改变我的图像库吗?
【发布时间】:2009-05-14 00:53:47
【问题描述】:

在 Delphi 中,Image Base 链接器选项默认为 00400000

根据帮助:

指定首选加载地址 编译后的图像。这个值是 通常仅在编译时更改 DLL。默认值 = 400000

在EXE上修改它没有影响吗?会有什么效果?地址是相对于每个进程的吗?

【问题讨论】:

    标签: delphi dll executable


    【解决方案1】:

    如果可能,操作系统加载程序会在其首选加载地址(Image Base)处加载可执行映像(EXE 和 DLL,以及其他伪装成 DLL 的东西,例如 BPL 和 OCX);如果虚拟地址空间的该区域被保留用于其他目的(另一个图像、线程堆栈、堆分配),那么 OS 加载程序将重新定位该图像。重定位映像涉及将其放在地址空间中的其他位置,然后获取新加载地址和首选加载地址之间的差异,并将此差异添加到映像内的每个重定位修复中。重定位修正指向可执行映像中代码或数据引用自身的所有位置,例如代码从全局变量加载值,或绝对跳转到其他例程。

    因为重定位涉及到操作系统修改图像数据的内存版本,所以耗时更长,占用更多的I/O并提交更多页面(需要将整个带有重定位的图像分页),并且操作系统虚拟内存子系统将无法与已加载相同可执行映像的其他进程共享加载的映像(因为它在内存中会有所不同)。因此,最好避免在加载时重新定位。

    在 32 位 Windows 上,可执行映像的首选地址是 $00400000,而其他 DLL(包括 OS DLL)依赖此约定,因为没有可能与主可执行文件一致的默认加载地址。因此,他们避免了搬迁。事实上,重新定位 EXE 映像的情况非常少见,因此通常可以从 EXE 映像中删除重新定位数据而不会造成伤害。

    为 DLL 更改它是有意义的,以避免与任何默认 OS DLL 以及通常随 DLL / EXE 一起提供的任何其他 DLL 发生冲突。由于为 EXE 更改它会增加操作系统需要重新定位 DLL 的机会,因此不建议更改 EXE 加载地址。

    不建议将像UPX 这样的可执行映像压缩器特别用于 DLL 以及可能运行许多实例的可执行文件,因为内存中解压缩的作用类似于重定位,以防止内存中映像在多个进程之间共享.

    【讨论】:

      【解决方案2】:

      更改 EXE 的图像库几乎没有用,除非你正在做一些非常低级的脏 hack。

      地址是相对于每个进程的吗?

      是的,每个进程都有自己的地址空间。

      【讨论】:

        猜你喜欢
        • 2018-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多