Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 若DLL中的函数地址加载到应用程序中,它是否可能发生更改?_C++_Function_Dll_Memory Address - Fatal编程技术网

C++ 若DLL中的函数地址加载到应用程序中,它是否可能发生更改?

C++ 若DLL中的函数地址加载到应用程序中,它是否可能发生更改?,c++,function,dll,memory-address,C++,Function,Dll,Memory Address,我反汇编了一个DLL,看到了一些函数。我找到了我需要的函数,它的地址是0x10001340 如果我将这个dll加载到我的应用程序中,这个地址会保持不变吗?那么,我可以从我的应用程序中通过它的地址调用该函数吗 我这样问是因为我不确定:如果加载此dll时,主应用程序中的某些函数已经具有相同的地址,该怎么办?因此,dll中的函数可能会在加载时更改地址,等等。Windows dll上的具有优先加载地址,但如果加载程序注意到虚拟地址空间的这一部分已被使用,则可以更改所有这些引用。这一过程被称为“重新定基”

我反汇编了一个DLL,看到了一些函数。我找到了我需要的函数,它的地址是
0x10001340

如果我将这个dll加载到我的应用程序中,这个地址会保持不变吗?那么,我可以从我的应用程序中通过它的地址调用该函数吗


我这样问是因为我不确定:如果加载此dll时,主应用程序中的某些函数已经具有相同的地址,该怎么办?因此,dll中的函数可能会在加载时更改地址,等等。Windows dll上的

具有优先加载地址,但如果加载程序注意到虚拟地址空间的这一部分已被使用,则可以更改所有这些引用。这一过程被称为“重新定基”

“默认”基址是在链接时指定的(
/base
,使用Microsoft链接器),如果您计划将dll与另一个具有相同基址的dll一起使用,则将其设置为不同于默认值的值会很有用;这加快了加载过程,因为加载程序不必在每次加载时重新设置一个DLL的基址。(IIRC还有一些工具能够重新设置现有dll的基础,并将结果保存在磁盘上)

请记住,从Windows Vista开始,使用指定标志编译的DLL总是在随机基址加载,以避免某种攻击。

最终使用相同地址的可能性极低。DLL链接器的默认/基本参数为0x10000000,这就是入口点在该地址的结束方式。但是有许多DLL是使用默认设置链接的,实际上只有一个DLL可以在该地址加载。以后加载的所有其他文件都需要重新加载


您可以为/BASE找到一个更好的值,但这永远不能保证您得到所需的加载地址。

正如Matteo所说,DLL具有首选加载地址(在结构的ImageBase字段中指定)。当系统尝试加载DLL时,如果可能(除非启用了地址空间随机化),它将在此地址加载DLL,并且不需要“修补”。如果无法在首选地址加载,则重新定位DLL,这将需要修补DLL中的任何绝对引用,以补偿重新定位

所以要回答你的问题:
无法保证DLL将在其首选地址加载。一旦加载,后续加载将不会加载更多的DLL副本,因此地址不会更改。但是,一旦卸载(DLL是引用计数的),就不能保证下次将在同一地址加载它

关于什么选项D地址在加载时可以更改吗?