我需要重建几年前建立的DLL。我有原始的C源代码,但不是Visual Studio项目或解决方案。我想尝试使用最初使用的相同Visual Studio版本重建它。我可以说这是一个普通的旧Windows DLL,而不是.NET。我也知道源代码在C中。通过检查DLL二进制文件,还有什么我可以告诉原始构建环境和工具吗?
谢谢!
答案 0 :(得分:18)
当然,这完全有可能。关键是所有PE格式的映像(可执行二进制文件的Windows格式,包括DLL和EXE)都包含包含有关二进制文件本身的属性和其他信息的标头。 Microsoft的工具链始终在该标头中设置字段,以指示用于构建它的工具的版本。因此,您可以转储该标题并检查这些字段以找出您想知道的内容。
虽然有第三方应用程序可以为您提取和漂亮打印此信息,但如果您安装了任何版本的Visual Studio或Windows SDK,则最简单的方法是使用dumpbin。打开Visual Studio命令提示符,键入dumpbin /headers <path to your DLL>
,然后按 Enter 。你会得到一个大的标题数据列表;不要让它吓倒你,你只对几个领域感兴趣。
向上滚动到顶部。对于DLL,您将看到文件类型是DLL(显然)。 “FILE HEADER VALUES”部分中的第一个属性有时也很有趣:它告诉您DLL是用于32位还是64位计算机。然后在下一节“可选链接值”下查看“链接器版本”字段。正如我所提到的,这是由所有Microsoft链接器填充的,其中链接器的版本用于创建二进制文件。格式为major.minor,因此14.00是Visual Studio 2015,10.00是Visual Studio 2010等。有a table of these version numbers on Wikipedia(您想要的列在此标记为“版本号”,因为您需要链接器,而不是编译器的版本,cl.exe)。其他可能有趣的领域是“操作系统版本”和/或“子系统版本” - 这些将告诉您构建二进制文件的目标版本。例如,10.00表示Windows 10,5.01表示Windows XP,依此类推。再次,请参阅Wikipedia for a table of Windows version numbers。
另一个相关信息可能是您的二进制链接的C运行时库(CRT)的哪个版本(假设它实际上链接到CRT)。您也可以使用dumpbin来确定这一点,但这次查看导入。 (或者您可以使用类似Process Explorer的内容来获得漂亮的列表。)运行dumpbin /imports <path to your DLL>
,然后滚动列表查找以“MSVCR”开头的内容。名称的其余部分表示版本号。 MSVCR80表示VC ++ 8或VS 2005.MSVCR90表示VC 9或VS 2008.MSVCR100表示VC 10或VS 2010.依此类推。
即使已从二进制文件中删除符号,所有这些都有效。