同一个dll资料在不同的进程中映射的基地址为什么可能不同

同一个dll文件在不同的进程中映射的基地址为什么可能不同?
动态库 dll在内存中不是只有一个版本,为什么同一个dll文件在不同的进程中映射的基地址为什么可能不同? 

听说:隐性联接(implicitly link)的动态联接库 和 动态加载该dll文件 可能产生如上不一致情况,但是我使用MessageBox 试验却发现2个地址是一致的

#include <stdio.h>
#include <time.h> 
#include <windows.h>

 

int main(int argc, char* argv[])
{
    printf("MessageBox GetProcAddress:%0p\n", MessageBox);
return 0;
}


int main(int argc, char* argv[])
{
    HINSTANCE hUser32 = LoadLibrary("User32.dll");  
    DWORD dwMessageBox = (DWORD)GetProcAddress(hUser32, "MessageBoxA");  
    printf("dwMessageBox GetProcAddress:%0p\n", dwMessageBox);
    
return 0;
}
dll 映射 基地址 不一致

------解决方案--------------------
存在地址被占用的情况,所以就会重定位,地址可能也就不一样了
------解决方案--------------------
在内存中是指有一个版本,这里的内存是指实际的物理内存。而你进程里看到的内存地址是该进程的虚拟内存地址。这些虚拟地址最终都是map到同一个实际内存地址,但虚拟地址本身可以不同。
------解决方案--------------------
进程的地址不一样,你看到的只是进程中的虚拟地址。不是物理地址,你利用汇编只是转化为物理地址就会发现是一样的了