如何确定使用哪个 C 或 C++ 编译器来构建特定的 Windows 可执行文件或 DLL?一些编译器会在最终的可执行文件中留下版本字符串,但这在 Windows 上似乎比在 Linux 上更罕见。
具体来说,我感兴趣的是区分 Visual C++ 和各种 MinGW 编译器(通常从函数签名来看相当容易),然后区分 Visual C++ 版本(6、2002/2003、2005、2008;更难做到)。有没有一种工具可以以半可靠的方式进行区分?
区分 VC 版本的提示来源之一是链接的特定 C 运行时库。由于默认情况是(至少在现代版本中)链接到 DLL,因此这相当容易做到。实用性依赖步行者对于验证您是否知道真正正在加载哪些 DLL 几乎是必不可少的,并且它会告诉您正在使用哪个 C 运行时 DLL。尽管 Dependency Walker 包含在 Microsoft Platform SDK 中,但它已被独立扩展,我链接的站点是其当前开发的主页。
VC6 和 MinGW 默认情况下都链接到 MSVCRT.DLL,因此不会区分它们。经过一些努力,MinGW 也可以链接到更高的 C 运行时版本,因此您需要独立排除 MinGW。
Runtime VC Version
---------- -------------
MSVCRT.DLL VC6
MSCVR80.DLL VC8 (VS 2005)
MSCVR90.DLL VC9 (VS 2008)
其他运行时 DLL 也是很好的线索,例如对 Delphi 运行时的引用可能表明 EXE 实际上是从 Delphi 构建的,而不是 C 工具链。
如果符号尚未从 .EXE 文件中删除,那么您可能会发现一些存在内部符号的线索。例如,对类似内容的引用_sjlj_init
可能表明在某个时刻涉及为 setjmp/longjmp 异常处理配置的 MinGW GCC 3.x。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)