【问题标题】:Can I tell what version of Visual Studio was used to build a DLL by examining the DLL itself我可以通过检查 DLL 本身来判断用于构建 DLL 的 Visual Studio 版本吗
【发布时间】:2017-04-11 09:47:13
【问题描述】:

我需要重新构建几年前最后构建的 DLL。我有原始 C 源代码,但没有 Visual Studio 项目或解决方案。我想尝试使用最初使用的相同 Visual Studio 版本来重建它。我可以说这是一个普通的旧 Windows DLL,而不是 .NET。我也知道源代码是用 C 语言编写的。通过检查 DLL 二进制文件,我还能告诉我关于原始构建环境和工具的其他任何信息吗?

谢谢!

【问题讨论】:

    标签: c windows visual-studio winapi dll


    【解决方案1】:

    当然,这完全有可能。关键是所有 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)。这里其他可能有趣的字段是“操作系统版本”和/或“子系统版本”——它们会告诉你二进制文件是针对哪个版本的 Windows 构建的。例如,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。以此类推。

    即使符号已从二进制文件中删除,所有这些都可以正常工作。

    【讨论】:

    • 谢谢你,科迪。我得到了链接器版本 9.0、操作系统版本 5.00 和子系统版本 5.00。看起来像 Visual Studio 2008。在导入下,我看到从 KERNEL32.dll 导入的多个函数,但没有别的。这是否一定意味着 C 运行时是静态链接的?或者是否有可能,DLL 根本不需要 C 运行时,即使它是用 C 编写的?似乎应该可以判断 C 运行时是否静态包含在 DLL 中,对吧?
    • @George - 但你有 src 代码 - 所以可以轻松查看使用 crt。而不是强制使用相同版本的 VS - 这只是外壳。真正的编译/链接过程取决于 cl.exe/link.exe 版本,但通常它向后兼容 - 通常使用较新的 CL 编译的旧代码,但很可能会出现许多新警告。如果使用 crt,您的主要问题可能在于 - 您可能需要旧的 crt 头文件/库。如果不是 crt - 你可以在任何 VS 中使用任何 cl/link 构建速度更快
    • 谢谢你们俩。它现在可以与 Visual Studio 2008 一起构建和工作。
    • 对此进行快速更新,该 wiki 上 VS 版本表的解释与 Cody 在 2017 年及以后的回答不太匹配。在 VS 2017 中,VS IDE 版本是 15.x.x,但是 VC++ 工具集版本(现在实际上不止一个)是 14.11 或 14.12,具体取决于更新,截至今天分别为 15.4。您将从 PE 标头获得的链接器版本将匹配 VC++ 工具集版本,而不是 VS 版本。
    • 这里有一个更准确的表格:mariusbancila.ro/blog/2015/08/12/…
    猜你喜欢
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多