.dll的.edata
部分除了单独的函数导出规范之外,还包含一个指定Dll名称的字段(请参阅此引用 “Name RVA”字段)。 然而,在我可以find的所有文档中,导入的parsing总是指向Dll文件名和path,当然这些可以与本条目中指定的“已logging”Dll名称不同。
这个领域的目的是什么? 它在解决import方面有什么作用吗?
在调试原始内存时,从中加载DLL的文件名(和路径)可能不容易获得,并且导出表中的这个字段是一种方便的方法,用于识别某个特定的DLL所占用的内存区域。
除了它的调试价值足够的理由,Windows加载器也可以在递归解析导入时使用这个字段,以确定是否已经加载了一个特定的模块,或者作为系统DLL的安全完整性检查等。即使在这种情况下在现代版本的Windows中,PE / COFF规范至少提供了这种可能性。
要直接回答你的问题,这个领域在解决进口问题上没有任何作用,至少它没有用到。 这可能在最近的Windows版本中有所改变,但是如果它应用于非系统DLL,它将会破坏向后兼容性。 我的猜测是,对于任何类型的进口决议,这个领域都是被忽略的。
为了好玩,我使用以下标准在Windows 7(64位)机器上使用32位PE模块进行了快速测试:
只要测试EXE的被引用的导入段具有正确的文件名,这个DLL碰巧在启动点被命名,那么这两个版本的私有DLL在我启动测试EXE的时候就成功加载了。