如何确定哪个C或C编译器用于构建特定的
Windows可执行文件或DLL?一些编译器在最终的可执行文件中留下版本字符串,但这似乎在Windows上比在
Linux上更少.
具体来说,我有兴趣区分Visual C和各种MinGW编译器(通常功能签名相当简单),然后在Visual C版本(2002,2003,2005,2008之间更难做)中.那里有一个可以半可靠的区别的工具吗?
解决方法
一个区别VC版本的提示的一个来源是链接的特定C运行时库.由于默认情况是(至少在现代版本)链接到DLL,这是很容易做到的.实用程序
Dependency Walker几乎不可缺少,用于验证您是否知道正在加载哪些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.