C++ Windows PE数据段映射到32位进程空间中的确切地址

C++ Windows PE数据段映射到32位进程空间中的确切地址,c++,windows,linker,32-bit,portable-executable,C++,Windows,Linker,32 Bit,Portable Executable,我试图确认在读取后,来自可执行文件的数据是否总是映射到进程空间中的相同地址。即图像库和数据库在我的可执行文件的PE中定义。所以,当我将图像库添加到数据库时,我知道数据段将从进程空间的何处开始。问题是:这是有保证的,还是操作系统可以决定将其重新定位到内存中的不同地址? 我在一些Windows XP 32位计算机上尝试了这个方法,假设是正确的——地址保持不变,exe中存储的内部指针不需要任何修改,但在Windows 7 64位(运行相同的32位可执行文件)上,所有数据都被移动,指针都被修补。这一点并

我试图确认在读取后,来自可执行文件的数据是否总是映射到进程空间中的相同地址。即图像库和数据库在我的可执行文件的PE中定义。所以,当我将图像库添加到数据库时,我知道数据段将从进程空间的何处开始。问题是:这是有保证的,还是操作系统可以决定将其重新定位到内存中的不同地址? 我在一些Windows XP 32位计算机上尝试了这个方法,假设是正确的——地址保持不变,exe中存储的内部指针不需要任何修改,但在Windows 7 64位(运行相同的32位可执行文件)上,所有数据都被移动,指针都被修补。这一点并不重要,因为我的主要问题是关于32位Windows操作系统上地址的一致性。
谢谢

从马克·鲁西诺维奇关于这个主题的演讲开始:@Mgetz,thx。我试着在三个浏览器(包括IE)中加载,但它从来没有到达实际的视频。这段视频也是关于将节映射到虚拟地址的吗?你还可以分享其他想法和链接吗?谢谢!首选地址只是首选地址。例如,如果地址不可用,或者启用了ASLR,则可能不遵守首选项。Windows 7默认启用ASLR,XP不启用。@RaymondChen这看起来是一个很好的答案,或者是一个很好的博客。。。虽然我以为你的博客在某个时候已经涵盖了ALSR(粗略搜索找不到)。@RaymondChen,噢,哇,这里是Raymond Chen!太好了!我知道地址可能不可用,但EXE总是在任何DLL之前先加载,那么地址不可用于可执行文件的条件是什么?另外,我主要对XP SP3感兴趣,因为ASLR不可用。谢谢