gpt4 book ai didi

delphi - 我应该更改我的图像库吗?

转载 作者:行者123 更新时间:2023-12-03 14:38:09 24 4
gpt4 key购买 nike

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

根据帮助:

Specifies the preferred load address of the compiled image. This value is typically only changed when compiling DLLs. Default = 400000

更改它对 EXE 没有影响吗?效果会怎样呢?地址是相对于每个进程的吗?

最佳答案

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

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

按照 32 位 Windows 上的约定,可执行镜像的首选地址是 $00400000,而其他 DLL(包括操作系统 DLL)则依赖此约定,因为没有可能与主要可执行文件。因此,他们避免了搬迁。事实上,重新定位 EXE 镜像的情况很少发生,因此通常可以从 EXE 镜像中删除重定位数据而不会造成任何损害。

将其更改为 DLL 可以避免与任何默认操作系统 DLL 以及通常随 DLL/EXE 附带的任何其他 DLL 发生冲突。由于更改 EXE 的地址会增加操作系统需要重新定位 DLL 的机会,因此不建议更改 EXE 加载地址。

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

关于delphi - 我应该更改我的图像库吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/861103/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com