Windows Win32/Dll:调用Dll函数时跳转到的地址?

Windows Win32/Dll:调用Dll函数时跳转到的地址?,windows,winapi,dll,assembly,x86,Windows,Winapi,Dll,Assembly,X86,当执行“call”指令调用DLL导出函数时,它会将EIP设置为DLL中存储的函数地址。如果同时执行的另一个程序调用属于同一DLL的同一个函数,跳转地址是否相同?由于其他程序/进程映射到各自单独的地址空间,我怀疑地址是否相同。简短的回答是,这要视情况而定 DLL按节组织,每个节可以由多个进程共享。通常只有共享的代码段(当DLL加载在相同的基址时),每个进程都有其私有数据段 DLL的优点之一是,您可以在多个进程之间共享它们的代码(然后您可以节省系统内存,因为系统不会加载它们的许多实例)。当然,数据不

当执行“call”指令调用DLL导出函数时,它会将EIP设置为DLL中存储的函数地址。如果同时执行的另一个程序调用属于同一DLL的同一个函数,跳转地址是否相同?

由于其他程序/进程映射到各自单独的地址空间,我怀疑地址是否相同。

简短的回答是,这要视情况而定

DLL按节组织,每个节可以由多个进程共享。通常只有共享的代码段(当DLL加载在相同的基址时),每个进程都有其私有数据段

DLL的优点之一是,您可以在多个进程之间共享它们的代码(然后您可以节省系统内存,因为系统不会加载它们的许多实例)。当然,数据不能(通常)共享,因此必须为每个实例复制数据

这意味着通常DLL代码的内存在不同进程之间共享,那么可能具有相同的地址。我之所以说“可以”,是因为,即使内存是共享的,也不能保证它在每个进程上都有相同的地址。要进行快速测试,请使用
GetProcAddress
并多次运行该过程以比较函数地址,您可以从以下位置使用此简单程序:

#包括
#包括
void_tmain()
{
typedef void(WINAPI*PGNSI)(LPSYSTEM_信息);
系统信息系统;
零内存(&si,sizeof(系统信息));
PGNSI fGetNativeSystemInfo=重新解释强制转换(GetProcAddress(
GetModuleHandle(文本(“kernel32.dll”),“GetNativeSystemInfo”);

为什么这很重要?你想解决什么问题?为什么要问这个?这些知识对你有什么好处?在虚拟地址空间中,答案是“可能,但你无论如何都不应该指望它”。因为我想知道DLL的实例是属于进程的还是其他。如果一个DLL同时被多个程序使用,是否意味着此DLL将有多个实例?
#include <windows.h>
#include <iostream>

void _tmain()
{
    typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);

   SYSTEM_INFO si;
   ZeroMemory(&si, sizeof(SYSTEM_INFO));

   PGNSI fnGetNativeSystemInfo = reinterpret_cast<PGNSI>(GetProcAddress(
       GetModuleHandle(TEXT("kernel32.dll")),  "GetNativeSystemInfo"));

   std::cout << fnGetNativeSystemInfo << std::endl;
}